GraphQL 中继返回一条记录

Posted

技术标签:

【中文标题】GraphQL 中继返回一条记录【英文标题】:GraphQL relay return one record 【发布时间】:2018-03-15 11:58:49 【问题描述】:

我在我的项目中使用了 graphql-relay

在我的 grapgql 中运行此查询时:


  viewer
    boRelayCustomerInfo(_id:"59267769de82262d7e39c47c") 
      edges 
        node 
          id
        
      
     
  

我给出了这个错误: "message": "arraySlice.slice is not a function"

我的查询代码是:

import 
  GraphQLID,
  GraphQLNonNull,
 from 'graphql'

import 
  connectionArgs,
  connectionFromPromisedArray,
 from 'graphql-relay'


import  customerConnection  from '@/src/schema/type/customer/CustomerType'
import  CustomerModel, ObjectId  from '@/src/db'


export default 
  type: customerConnection.connectionType,
  args: 
    ...connectionArgs,
    _id: 
      type: new GraphQLNonNull(GraphQLID),
    ,
  ,
  resolve: (_, args) => connectionFromPromisedArray(
    CustomerModel.findOne(_id: ObjectId(args._id)),
    args,
  ),

请告诉我们,如何在中继中只返回一条记录。

【问题讨论】:

【参考方案1】:

如官方文档中所述graphql-relay-js

connectionFromPromisedArray 接受一个解析为数组的承诺

所以,这里的问题在于 connectionFromPromisedArray 方法中传递的第一个参数。 IE: CustomerModel.findOne(_id: ObjectId(args._id))

其中 findOne 返回一个对象,而您需要使用 find 以数组形式获取响应。

问题代码:

  resolve: (_, args) => connectionFromPromisedArray(
    CustomerModel.findOne(_id: ObjectId(args._id)), // <=== Error
    args,
  ),

问题的解决方案:

 resolve: (_, args) => connectionFromPromisedArray(
    CustomerModel.find(_id: ObjectId(args._id)), // <=== Solution
    args,
  ),

希望对你有帮助:)

【讨论】:

以上是关于GraphQL 中继返回一条记录的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 Typescript 的泛型将中继(graphql)连接映射到边缘节点

如何从graphql突变返回新记录而不是null

GraphQL,中继:处理错误

GraphQL 和中继过滤 UI

我对中继和graphql解析方法感到困惑

无论如何要检查中继是不是注入了graphql服务器?