多对多 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
            ...
        }
    })
});

...