【问题标题】:GraphQL ConnectionsGraphQL 连接
【发布时间】:2018-11-03 02:54:18
【问题描述】:

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

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;

这里的问题是我有这个错误,其中 MembershipType 中的用户字段 导致错误

块引用 /Users/nizarayari/Arise/arise-auth/node_modules/graphql/jsutils/invariant.js:19 抛出新的错误(消息); ^ 错误:预期 undefined 是 GraphQL 可为空的类型。 在不变量(/Users/nizarayari/Arise/arise-auth/node_modules/graphql/jsutils/invariant.js:19:11) 在 assertNullableType (/Users/nizarayari/Arise/arise-auth/node_modules/graphql/type/definition.js:261:51) 在新的 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 (module.js:635:10) 在 Module.load (module.js:545:32) 在 tryModuleLoad (module.js:508:12) 在 Function.Module._load (module.js:500:3) 在 Module.require (module.js:568:17) 在要求(内部/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 (module.js:635:10) 在 Module.load (module.js:545:32) 在 tryModuleLoad (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,
};

没有会员资格查询,只是突变

【问题讨论】:

  • 似乎UserType 可能在type: new GraphQLNonNull(UserType) 中未定义。
  • 是的。但找不到原因?

标签: javascript graphql graphql-js relay express-graphql


【解决方案1】:

您可能需要在文件中将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

【讨论】:

    【解决方案2】:

    两个字段是否在同一个js文件中?您在 Memberships 和 UserType 上都有 export default,看起来像同一个 js 文件。

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

    将两个字段分开后,由于 Membership 依赖于 UserType,诀窍是使用返回 Membership 中的字段对象的函数

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

    代替:

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

    【讨论】:

    猜你喜欢
    • 2018-01-15
    • 2018-10-26
    • 2021-09-23
    • 2019-07-08
    • 2016-12-09
    • 2016-06-26
    • 2020-09-16
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多