首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GraphQL:在GraphQLObjectType中使用自定义类型定义GraphQLList时出错

GraphQL:在GraphQLObjectType中使用自定义类型定义GraphQLList时出错
EN

Stack Overflow用户
提问于 2018-04-13 14:39:06
回答 1查看 740关注 0票数 1

我想学习GraphQL,我正在编写一个表示图书商店的示例,用户可以在其中编写多本书的作者。

我的问题是,我不能在BookType( UserType,GraphQLObjectType)中定义一个类型为“UserType”的列表。奇怪的是,当BookType有一个作者时,它不会抛出错误。

user.js (UserType):

代码语言:javascript
运行
复制
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):

代码语言:javascript
运行
复制
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) }
    })
});

如您所见,我记录了、BookType、UserType。奇怪的是,当我记录BookType时,会得到一个空对象。

输出:

代码语言:javascript
运行
复制
console.log(BookType) --> {}
console.log(UserType) --> User

以下是错误:

代码语言:javascript
运行
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-03 19:20:37

你在这里重复了很多代码。我将开始创建一个名为schema.js的文件。

开发您的RootQuery的工作,下面是一个可以帮助您的示例:

代码语言:javascript
运行
复制
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和其他人创建函数。这方面的一个例子是:

代码语言:javascript
运行
复制
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,不如只导出一次

代码语言:javascript
运行
复制
module.exports = new GraphQLSchema({ query: RootQuery });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49819507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档