我在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)
任何帮助或提示,谢谢!
看起来像是循环依赖问题。您要将User模块导入到Note模块中,同时将Note模块导入到User模块中。您用于该user字段的解析器正在寻找GraphQLObjectType的实例,但它仅接收到未完成的导出类型副本。
您可以查看此问题以获得更详尽的解释和一些变通办法。
但是,我建议仅使用buildSchema用字符串文字声明架构,然后通过根对象传递解析器。或使用graphql-tool的makeExecutableSchema,这甚至更加容易。无论哪种方式,您都可以避免处理循环依赖关系的麻烦,并使模式更具可读性。
| 归档时间: |
|
| 查看次数: |
1347 次 |
| 最近记录: |