错误:Note.user字段类型必须是Output Type,但得到:[object Object]

Jul*_*eta 1 node.js graphql

我在graphql上是个新手,我正在玩一个简单的案例,无法使其正常工作,案例是一对多的简单案例,一个用户有很多注释,一个注释属于用户。我的问题是“ NoteType”,我不能返回“ UserType”,我可以返回创建注释的用户的用户名,但不能返回UserType

代码(重要删除一些字段)

音符类型

当我取消注释用户时,出现错误错误:Note.user字段类型必须为Output Type,但得到:[object Object]。

import {
  GraphQLObjectType,
  GraphQLInt,
  GraphQLString,
  GraphQLBoolean,
} from 'graphql';

import UserType from '../User/UserType';
import User from '../User/User';

const NoteType = new GraphQLObjectType({
  name: 'Note',
  description: 'This represents a Note',
  fields: () => ({
    id: {
      type: GraphQLInt,
      resolve: (note) => note.id,
    },
    userId: {
      type: GraphQLInt,
      resolve: (note) => note.userId,
    },
    title: {
      type: GraphQLString,
      resolve: (note) => note.note,
    },
    username: {
      type: GraphQLString,
      resolve: (note) => (
        User
          .findOne({
            where: {
              id: note.userId,
            },
          }).then(user => user.username)
      ),
    },
    /* user: {  ***PROBLEM HERE!!***
      type: UserType,
      resolve: (note) => (
        User
          .findOne({
            where: {
              id: note.userId,
            },
          }).then(user => user)
      ),
    },*/
  }),
});

module.exports = NoteType;
Run Code Online (Sandbox Code Playgroud)

用户类型

import {
  GraphQLObjectType,
  GraphQLInt,
  GraphQLString,
  GraphQLList,
} from 'graphql';

import NoteType from '../Note/NoteType';
import Note from '../Note/Note';

import LocationType from '../Location/LocationType';
import Location from '../Location/Location';

const UserType = new GraphQLObjectType({
  name: 'User',
  description: 'This represents a User',
  fields: () => ({
    id: {
      type: GraphQLInt,
      resolve: (user) => user.id,
    },
    username: {
      type: GraphQLString,
      resolve: (user) => user.username,
    },
    email: {
      type: GraphQLString,
      resolve: (user) => user.email,
    },
    notes: {
      type: new GraphQLList(NoteType),
      resolve: (user) => (
        Note
          .findAll({
            where: {
              userId: user.id,
            },
          })
      ),
    },
  }),
});

module.exports = UserType;
Run Code Online (Sandbox Code Playgroud)

笔记查询

import {
  GraphQLInt,
  GraphQLString,
  GraphQLList,
} from 'graphql';

import NoteType from '../../models/Note/NoteType';
import Note from '../../models/Note/Note';

import UserType from '../../models/User/UserType';
import User from '../../models/User/User';

const noteQuery = {
  type: new GraphQLList(NoteType),
  args: {
    id: {
      name: 'id',
      type: GraphQLInt,
    },
    userId: {
      name: 'userId',
      type: GraphQLInt,
    },
    user: {
      name: 'user',
      type: GraphQLString,
    },
    note: {
      name: 'note',
      type: GraphQLString,
    },
    createdAt: {
      name: 'createdAt',
      type: GraphQLString,
    },
    updatedAt: {
      name: 'updatedAt',
      type: GraphQLString,
    },
  },
  resolve: (user, args) => Note.findAll({ where: args }),
};

module.exports = noteQuery;
Run Code Online (Sandbox Code Playgroud)

用户查询

import {
  GraphQLInt,
  GraphQLString,
  GraphQLList,
} from 'graphql';

import UserType from '../../models/User/UserType';
import User from '../../models/User/User';

const userQuery = {
  users: {
    type: new GraphQLList(UserType),
    args: {
      id: {
        name: 'id',
        type: GraphQLInt,
      },
      username: {
        name: 'username',
        type: GraphQLString,
      },
      email: {
        name: 'email',
        type: GraphQLString,
      },
      createdAt: {
        name: 'createdAt',
        type: GraphQLString,
      },
      updatedAt: {
        name: 'updatedAt',
        type: GraphQLString,
      },
    },
    resolve: (user, args) => User.findAll({ where: args }),
  },
  user: {
    type: UserType,
    args: {
      id: {
        name: 'id',
        type: GraphQLInt,
      },
      username: {
        name: 'username',
        type: GraphQLString,
      },
      email: {
        name: 'email',
        type: GraphQLString,
      },
      createdAt: {
        name: 'createdAt',
        type: GraphQLString,
      },
      updatedAt: {
        name: 'updatedAt',
        type: GraphQLString,
      },
    },
    resolve: (user, args) => User.findOne({ where: args }),
  },
};

module.exports = userQuery;
Run Code Online (Sandbox Code Playgroud)

任何帮助或提示,谢谢!

Dan*_*den 5

看起来像是循环依赖问题。您要将User模块导入到Note模块中,同时将Note模块导入到User模块中。您用于该user字段的解析器正在寻找GraphQLObjectType的实例,但它仅接收到未完成的导出类型副本。

您可以查看此问题以获得更详尽的解释和一些变通办法。

但是,我建议仅使用buildSchema用字符串文字声明架构,然后通过根对象传递解析器。或使用graphql-toolmakeExecutableSchema,这甚至更加容易。无论哪种方式,您都可以避免处理循环依赖关系的麻烦,并使模式更具可读性。