簡體   English   中英

GraphQL:在GraphQLObjectType中用自定義類型定義GraphQLList時出錯

[英]GraphQL: Error when defining a GraphQLList with a custom type in a GraphQLObjectType

我想學習GraphQL,並且正在編寫一個代表Book-Shop的示例,其中用戶可以是多本書的作者。

我的問題是我無法在UserType (GraphQLObjectType)中定義“ BookType” 類型的列表。 奇怪的是,當BookType具有作者時,它不會引發任何錯誤。

user.js(UserType):

const {
    GraphQLList,
    GraphQLID, 
    GraphQLString, 
    GraphQLObjectType,
    GraphQLNonNull,
    GraphQLInt,
     } = require('graphql');

const BookType = require('./book');
const BookSchema = require('../db/models/book');

console.log(BookType);

module.exports = new GraphQLObjectType({
    name: 'User',
    fields: () => ({
        id: { type: new GraphQLNonNull(GraphQLID) },
        name: { type: new GraphQLNonNull(GraphQLString) },
        books: { 
            type: new GraphQLList(BookType),
            resolve(parent, args){
                return BookSchema.find({_id: parent.id});
            }
         }
    })
});

book.js(BookType):

const {
    GraphQLID, 
    GraphQLString, 
    GraphQLObjectType,
    GraphQLNonNull,
    GraphQLInt } = require('graphql');

const UserType = require('./user');
const UserSchema = require('../db/models/user');

console.log(UserType);


module.exports = new GraphQLObjectType({
    name: 'Book',
    fields: () => ({
        id: { type: new GraphQLNonNull(GraphQLID) },
        author: { 
            type: UserType,
            resolve(parent, args){
                return UserSchema.findOne({_id: parent.author});
            }
         },
        title: { type: new GraphQLNonNull(GraphQLString) },
        sites: { type: new GraphQLNonNull(GraphQLInt) }
    })
});

如您所見,我記錄BookTypeUserType 奇怪的是,當我記錄BookType時得到了一個空對象。

輸出:

console.log(BookType) --> {}
console.log(UserType) --> User

這是錯誤:

Error: Expected [object Object] to be a GraphQL type.
    at invariant (/media/lorenz/DATA/Privat/Programmieren/JavaScript/NodeJS/bookShop/node_modules/graphql/jsutils/invariant.js:19:11)
    at assertType (/media/lorenz/DATA/Privat/Programmieren/JavaScript/NodeJS/bookShop/node_modules/graphql/type/definition.js:88:43)
    at new GraphQLList (/media/lorenz/DATA/Privat/Programmieren/JavaScript/NodeJS/bookShop/node_modules/graphql/type/definition.js:258:19)
    at fields (/media/lorenz/DATA/Privat/Programmieren/JavaScript/NodeJS/bookShop/src/types/user.js:21:19)
    at resolveThunk (/media/lorenz/DATA/Privat/Programmieren/JavaScript/NodeJS/bookShop/node_modules/graphql/type/definition.js:370:40)
    at defineFieldMap (/media/lorenz/DATA/Privat/Programmieren/JavaScript/NodeJS/bookShop/node_modules/graphql/type/definition.js:532:18)
    at GraphQLObjectType.getFields (/media/lorenz/DATA/Privat/Programmieren/JavaScript/NodeJS/bookShop/node_modules/graphql/type/definition.js:506:44)
    at typeMapReducer (/media/lorenz/DATA/Privat/Programmieren/JavaScript/NodeJS/bookShop/node_modules/graphql/type/schema.js:232:38)
    at /media/lorenz/DATA/Privat/Programmieren/JavaScript/NodeJS/bookShop/node_modules/graphql/type/schema.js:239:20
    at Array.forEach (<anonymous>)
    at typeMapReducer (/media/lorenz/DATA/Privat/Programmieren/JavaScript/NodeJS/bookShop/node_modules/graphql/type/schema.js:232:51)
    at /media/lorenz/DATA/Privat/Programmieren/JavaScript/NodeJS/bookShop/node_modules/graphql/type/schema.js:239:20
    at Array.forEach (<anonymous>)
    at typeMapReducer (/media/lorenz/DATA/Privat/Programmieren/JavaScript/NodeJS/bookShop/node_modules/graphql/type/schema.js:232:51)
    at Array.reduce (<anonymous>)
    at new GraphQLSchema (/media/lorenz/DATA/Privat/Programmieren/JavaScript/NodeJS/bookShop/node_modules/graphql/type/schema.js:122:28)

您在這里重復了很多代碼。 我將開始創建一個文件,將其schema.js

開發您的RootQuery工作,這是一個可以幫助您的示例:

const RootQuery = new GraphQLObjectType({
  name: 'RootQueryType',
  fields: {
    user: {
      type: UserType,
      args: { id: { type: GraphQLString } },
      resolve(parentValue, args) {
        return axios
          .get(`http://localhost:3000/users/${args.id}`)
          .then(res => res.data);
      }
    },
    company: {
      type: CompanyType,
      args: { id: { type: GraphQLString } },
      resolve(parentValue, args) {
        return axios
          .get(`http://localhost:3000/companies/${args.id}`)
          .then(res => res.data);
      }
    }
  }
});

導出,然后為UserType和其他人創建函數。 這是一個例子:

const UserType = new GraphQLObjectType({
  name: 'User',
  fields: () => ({
    id: { type: GraphQLString },
    firstName: { type: GraphQLString },
    age: { type: GraphQLInt },
    company: {
      type: CompanyType,
      resolve(parentValue, args) {
        return axios
          .get(`http://localhost:3000/companies/${parentValue.companyId}`)
          .then(res => res.data);
      }
    }
  })
});

因此,您無需導出每個的GraphQLObjectType ,而只需導出一次

module.exports = new GraphQLSchema({ query: RootQuery });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM