GraphQL relay возвращает одну запись

Я использовал 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. то есть: 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,
  ),

Надеюсь, поможет:)

Другие вопросы по тегам