代码之家  ›  专栏  ›  技术社区  ›  Mendes

使用thunks的GraphQL循环引用-错误:字段类型必须是输出类型,但get:未定义

  •  0
  • Mendes  · 技术社区  · 7 年前

    我必须求解GraphQL的循环定义,但由于某些原因,我无法求解。我查看了几篇关于thunks和延迟加载的帖子,下面是我当前的代码:

    const fields = {
        id: {
            type: new GraphQLNonNull(GraphQLID),
            resolve: (obj) => dbIdToNodeId(obj._id, "History")
        },
        timestamp: {
            type: GraphQLLong
        },
        objectId: {
            type: GraphQLString
        },
        user: {
            type: require('../User/connections').default,
            args: connectionArgs,
            resolve: (source, args) => {
                return UserModel.findOne({ id: source.id }).exec();
            }
        },
        action: {
            type: new GraphQLNonNull(GraphQLString)
        }
    };
    
    export const HistoryType = new GraphQLObjectType({
        name: 'History',
        description: 'History',
        interfaces: () => [NodeInterface],
        isTypeOf: (value) => value instanceof HistoryModel,
        fields: () => (fields)
    });
    

    历史/联系。js:

    import { HistoryType } from './types';
    const { connectionType: HistoryConnectionType } = connectionDefinitions( { nodeType: HistoryType });
    
    export default HistoryConnectionType;
    

    用户/类型。js公司

    const fields = {
        id: {
            type: new GraphQLNonNull(GraphQLID),
            resolve: (obj) => dbIdToNodeId(obj._id, "User")
        },
        email: {
            type: GraphQLString
        },
        history: {
            type: require('../History/connections').default,
            args: connectionArgs,
            resolve: (source, args, context) => {
                return HistoryModel.find({ deleted: false, objectId: source.id}).sort('timestamp').exec();
            }
        }
    };
    
    export const UserType = new GraphQLObjectType({
        name: 'User',
        description: 'User',
        interfaces: () => [NodeInterface],
        isTypeOf: (value) => value instanceof UserModel,
        fields: () => (fields)
    });
    

    用户/连接。js公司

    import { UserType } from './types';
    
    const { connectionType: UserConnectionType } = connectionDefinitions( { nodeType: UserType });
    
    export default UserConnectionType;
    

    const fields = {
        id: {
            type: new GraphQLNonNull(GraphQLID),
            resolve: (obj) => dbIdToNodeId(obj._id, "Company")
        },
        name: {
            type: GraphQLString
        },
        users: {
            type: require('../User/connections').default,
            args: connectionArgs,
            resolve: (source, args) => {
                const { id } = source;
                return UserModel.find({ companyId: id }).then((rows) => connectionFromArray(rows,args));
            }
        },
        history: {
            type: require('../History/connections').default,
            args: connectionArgs,
            resolve(source, args, context) {
                return loaders.getHistory(source.id);
            }
        }
    };
    
    export const CompanyType = new GraphQLObjectType({
        name: 'Company',
        description: 'Company',
        interfaces: () => [NodeInterface],
        isTypeOf: (value) => value instanceof CompanyModel,
        fields: () => (fields)
    });
    

    公司/连接。js公司

    import { CompanyType } from './types';
    
    const { connectionType: CompanyConnectionType } = connectionDefinitions( { nodeType: CompanyType });
    
    export default CompanyConnectionType;
    

    我做不到。运行Im时,会得到以下输出:

     History.user field type must be Output Type but got: undefined
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   yachaka    7 年前

    我想你现在已经解决了,但对于路过的人来说:
    在里面 history/types.js 这个 fields 对象必须内联在 领域 HistoryType ,因此它在运行时创建。

    const HistoryType = new GraphQLObjectType({
      ...
      fields: () => ({ ... }), // not a var, object is inlined
      ...
    });