GraphQL Connections - PullRequest
       23

GraphQL Connections

0 голосов
/ 24 мая 2018

У меня есть эти отношения между пользователем и его членством.Поле членства - это связь между пользователем и несколькими членами.

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 вызывает ошибку

Blockquote / 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 / возникают-auth / node_modules / graphql / тип / определение).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 (модуль.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) в случае необходимости (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 (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,
};

Нет запросов на членство, только мутация

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Оба поля находятся в одном файле js?У вас есть export default как для членства, так и для типа пользователя в том, что похоже на один и тот же файл js.

Вы можете использовать export default только для одного поля в каждом файле.

После разделения двух полей, поскольку членство зависит от типа пользователя, уловка заключается в том, чтобы использовать функцию, которая возвращает поляобъект в членстве

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

вместо:

const MembershipType = new GraphQLObjectType({
  name: 'Membership',
  interfaces: [nodeInterface],
  fields: {
    id: globalIdField(),
    ...
  }
});
0 голосов
/ 25 мая 2018

Возможно, вам понадобится переместить 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

...