首页 文章

GraphQL连接

提问于
浏览
0

我和用户及其成员有这种关系 . 成员资格字段是用户与多个成员资格之间的连接 .

const MembershipType = new GraphQLObjectType({
  name: 'Membership',
  interfaces: [nodeInterface],

  fields: {
    id: globalIdField(),

    user: {
      type: new GraphQLNonNull(UserType),
      resolve(parent, args, ctx: Context) {
        return ctx.userById.load(parent.user_id);
      },
    },

    role: {
      type: new GraphQLNonNull(GraphQLString),
    },

    team: {
      type: GraphQLString,
    },

    createdAt: {
      type: new GraphQLNonNull(GraphQLString),
      resolve(parent) {
        return parent.created_at;
      },
    },

    updatedAt: {
      type: new GraphQLNonNull(GraphQLString),
      resolve(parent) {
        return parent.updated_at;
      },
    },
  },
});

export default MembershipType;


const UserType = new GraphQLObjectType({
  name: 'User',
  interfaces: [nodeInterface],

  fields: {
    id: globalIdField(),

    firstName: {
      type: GraphQLString,
      resolve(parent) {
        return parent.first_name;
      },
    },

    lastName: {
      type: GraphQLString,
      resolve(parent) {
        return parent.last_name;
      },
    },

    email: {
      type: GraphQLString,
      resolve(parent) {
        return parent.email;
      },
    },

    memberships: {
      type: new GraphQLList(MembershipType),
      resolve(parent, args, ctx: Content) {
        return ctx.membershipsByUserId.load(parent.id);
      },
    },

    membershipsCount: {
      type: new GraphQLNonNull(GraphQLInt),
      resolve(parent, args, ctx: Context) {
        return ctx.userMembershipsCount.load(parent.id);
      },
    },
  },
});

export default UserType;

这里的问题是我有这个错误 user field in MembershipType 导致错误

Blockquote /Users/nizarayari/Arise/arise-auth/node_modules/graphql/jsutils/invariant.js:19抛出新的错误(消息); ^错误:预期未定义为GraphQL可空类型 . 在assertNullableType(/ Users / nizarayari / Arise / aris-auth / node_modules / graphql / type / definition)的不变量(/Users/nizarayari/Arise/arise-auth/node_modules/graphql/jsutils/invariant.js:19:11) . js:261:51)在Object的新GraphQLNonNull(/Users/nizarayari/Arise/arise-auth/node_modules/graphql/type/wrappers.js:79:54) . (/Users/nizarayari/Arise/arise-auth/src/schema/membership/MembershipType.js:25:13)在Module._compile(module.js:624:30)处于Object.Module._extensions..js(模块) .js:635:10)在Module.load(module.js:545:32)的try.moduleLoad(module.js:508:12),在Module.require的Function.Module._load(module.js:500:3) (module.js:568:17)at对象的require(internal / module.js:11:18) . (/Users/nizarayari/Arise/arise-auth/src/schema/user/UserType.js:19:1)在Module._compile(module.js:624:30)处于Object.Module._extensions..js(模块) .js:635:10)在tryModuleLoad的Module.load(module.js:545:32)(module.js:508:12)

这是我对用户的查询

import UserType from './UserType';
import type Context from '../../Context';

const me = {
  type: UserType,
  resolve(root: any, args: any, ctx: Context) {
    return ctx.user && ctx.userById.load(ctx.user.id);
  },
};

export default {
  me,
};

对会员资格的查询只是变异

2 回答

  • 1

    两个字段都在同一个js文件中吗?您在成员资格和UserType上有 export default ,看起来像是相同的js文件 .

    您只能在每个文件中的一个字段上使用 export default .

    将这两个字段分开后,由于Membership取决于UserType,诀窍是使用一个返回Membership中的fields对象的函数

    const MembershipType = new GraphQLObjectType({
      name: 'Membership',
      interfaces: [nodeInterface],
      fields: () => ({
        id: globalIdField(),
        ...
      })
    });
    

    代替:

    const MembershipType = new GraphQLObjectType({
      name: 'Membership',
      interfaces: [nodeInterface],
      fields: {
        id: globalIdField(),
        ...
      }
    });
    
  • 0

    您可能需要在文件中将 UserType 移到 MembershipType 之上 .

    let Foo = {
      bar: Bar
    }
    
    let Bar = 'bar'
    
    console.log(Foo.bar) // undefined
    
    Foo = {
      bar: Bar
    }
    
    console.log(Foo.bar) // 'bar'
    

    https://repl.it/@tcoughlin3/CumbersomeClassicRat

相关问题