多对多 graphql 模式错误
Many to Many graphql schema error
我是 GrpahQL 的新手,我正在尝试模拟用户和组之间的多对多关系。我的架构中定义了以下类型:
// UserType.js
const {
GraphQLObjectType,
GraphQLString,
GraphQLList,
GraphQLID } = require('graphql');
const {
GraphQLEmail } = require('graphql-custom-types');
const GroupType = require('./GroupType'); const AuthService = require('../../services/AuthService');
let authService = new AuthService();
const UserType = new GraphQLObjectType({
name: "UserType",
fields: () => ({
id: { type: GraphQLID },
user: { type: GraphQLString },
password: { type: GraphQLString },
name: { type: GraphQLString },
lastname: { type: GraphQLString },
email: { type: GraphQLEmail },
groups: {
type: new GraphQLList(GroupType),
resolve(parentValue) {
return authService.userGroups(userId);
}
}
}) });
module.exports = UserType;
这是另一个文件:
// GroupType.js
const {
GraphQLObjectType,
GraphQLString,
GraphQLID,
GraphQLList
} = require('graphql');
const UserType = require('./UserType');
const AuthService = require('../../services/AuthService');
let authService = new AuthService();
const GroupType = new GraphQLObjectType({
name: "GroupType",
fields: () => ({
id: { type: GraphQLID },
name: { type: GraphQLString },
description: { type: GraphQLString },
users: {
type: new GraphQLList(UserType),
resolve(parentArgs) {
return authService.userGroups(parentArgs.id);
}
}
})
});
module.exports = GroupType;
这个例子对我不起作用,因为出于某种原因我得到了这个错误:
Error: Can only create List of a GraphQLType but got: [object Object].
此错误仅发生在 GroupType 上,当两者相似时不会发生在 UserType 上。这里发生了什么?我做错了什么?
问题是 UserType
需要 GroupType
,而 GroupType
需要 UserType
:这称为循环依赖。
发生的事情是 UserType.js
被要求,在完成 运行 时导出 {}
(这是标准的 Node.js 模块执行),需要 GroupType
,这需要返回 UserType
并返回一个空对象,并将正确的 GraphQL GroupType
导出到 UserType
。所以 UserType
可以工作,因为它是 GroupType
的列表,但是 GroupType
不是因为它需要 UserType 而得到一个空对象。
要避免这种情况,您可以在 GroupType.js
中使用 运行time require:
// GroupType.js
...
// Remove the line which requires UserType at the top
// const UserType = require('./UserType');
const AuthService = require('../../services/AuthService');
...
const GroupType = new GraphQLObjectType({
...
fields: () => ({
...
users: {
type: new GraphQLList(require('./UserType')), // Require UserType at runtime
...
}
})
});
...
我是 GrpahQL 的新手,我正在尝试模拟用户和组之间的多对多关系。我的架构中定义了以下类型:
// UserType.js
const {
GraphQLObjectType,
GraphQLString,
GraphQLList,
GraphQLID } = require('graphql');
const {
GraphQLEmail } = require('graphql-custom-types');
const GroupType = require('./GroupType'); const AuthService = require('../../services/AuthService');
let authService = new AuthService();
const UserType = new GraphQLObjectType({
name: "UserType",
fields: () => ({
id: { type: GraphQLID },
user: { type: GraphQLString },
password: { type: GraphQLString },
name: { type: GraphQLString },
lastname: { type: GraphQLString },
email: { type: GraphQLEmail },
groups: {
type: new GraphQLList(GroupType),
resolve(parentValue) {
return authService.userGroups(userId);
}
}
}) });
module.exports = UserType;
这是另一个文件:
// GroupType.js
const {
GraphQLObjectType,
GraphQLString,
GraphQLID,
GraphQLList
} = require('graphql');
const UserType = require('./UserType');
const AuthService = require('../../services/AuthService');
let authService = new AuthService();
const GroupType = new GraphQLObjectType({
name: "GroupType",
fields: () => ({
id: { type: GraphQLID },
name: { type: GraphQLString },
description: { type: GraphQLString },
users: {
type: new GraphQLList(UserType),
resolve(parentArgs) {
return authService.userGroups(parentArgs.id);
}
}
})
});
module.exports = GroupType;
这个例子对我不起作用,因为出于某种原因我得到了这个错误:
Error: Can only create List of a GraphQLType but got: [object Object].
此错误仅发生在 GroupType 上,当两者相似时不会发生在 UserType 上。这里发生了什么?我做错了什么?
问题是 UserType
需要 GroupType
,而 GroupType
需要 UserType
:这称为循环依赖。
发生的事情是 UserType.js
被要求,在完成 运行 时导出 {}
(这是标准的 Node.js 模块执行),需要 GroupType
,这需要返回 UserType
并返回一个空对象,并将正确的 GraphQL GroupType
导出到 UserType
。所以 UserType
可以工作,因为它是 GroupType
的列表,但是 GroupType
不是因为它需要 UserType 而得到一个空对象。
要避免这种情况,您可以在 GroupType.js
中使用 运行time require:
// GroupType.js
...
// Remove the line which requires UserType at the top
// const UserType = require('./UserType');
const AuthService = require('../../services/AuthService');
...
const GroupType = new GraphQLObjectType({
...
fields: () => ({
...
users: {
type: new GraphQLList(require('./UserType')), // Require UserType at runtime
...
}
})
});
...