GraphQL - 传递一个 ObjectType 参数

GraphQL - passing an ObjectType a parameter

我正在使用 GraphQL,它运行良好,但是,我似乎无法弄清楚如何将参数传递到 Event GraphQLObjectTypefields 部分。

我希望能够将 currentUserId(通过令牌提供给我)传递到 Event GraphQLObjectType 中,以便我可以添加 isAttending 属性。

我附上了代码,其中包含我基本上想做的事情的注释:

const Event = new GraphQLObjectType({
  name: 'Event',
  description: 'This represents an Event',
  fields: (currentUserId) => { // currentUserId is the parameter I would like to pass in 
    return {
      id: {
        type: GraphQLInt,
        resolve (event) {
          return event.id;
        }
      },
      title: {
        type: GraphQLString,
        resolve (event) {
          return event.title;
        }
      },
      attendees: {
        type: new GraphQLList(User),
        resolve (event) {
          return event.getAttendees()
        }
      },
      // this is what I would like to do
      isAttending: {
        type: GraphQLBool,
        resolve (event) {
          return event.getAttendees({
            where: {
              id: currentUserId // that's the parameter I would like pass in
            }
          }).then(attendee => {
            return (attendee.length > 0 ? true : false);
          )};
        }
      }
      // end of what I'm trying to do //
    };
  }
});

const Query = new GraphQLObjectType({
  name: 'Query',
  description: 'Root query object',
  fields: () => {
    return {
      events: {
        type: new GraphQLList(Event),
        args: {
          id: {
            type: GraphQLInt
          }
        },
        resolve (root, args) {
          // here is the parameter I would like to pass to the event object
          let currentUserId = root.userId; 
          ////////

          return Db.models.event.findAll({ where: args });
        }
      },
      ...

更新

我不能只做 data.currentUserId = root.userId 的原因是当我返回 collection of event objects 时它不可见,因为传递到我的 Event GraphQLOBjectType 的只是{event} 对象。

当我执行 data.currentUserId 并且 data 中有一个对象数组时,它看起来像这样:

[{objects}, currentUserId: 1] 

与我们想要的相反:

[{object, currentUserId: 1}, {anotherObject, currentUserId: 1}] 

如果我想访问 Event GraphQLObject 中的 currentUserId,我唯一能想到的就是遍历每个对象并将 currentUserId 添加到它上面,如下所示:

return events.map(event => { 
  event.currentUserId = currentUserId; 
  return event; 
});`

这是最好的解决方案吗?

恐怕你做不到。 fields 没有收到任何参数,所以你也不会发送任何参数。

幸运的是,您可以通过更方便的方式实现。

resolve 函数中父类型 (Query) returns 的所有内容都在子解析的 root 参数中可见。

const Query = new GraphQLObjectType({
    name: 'Query',
    description: 'Root query object',
    fields: () => ({
            events: {
                type: new GraphQLList(Event),
                args: {
                    id: {
                        type: GraphQLInt
                    }
                },
                resolve (root, args) {

                    return Db.models.event.findAll({ where: args })
                            .then(data => {
                                // pass the parameter here
                                data.currentUserId = root.userId;
                                return data;
                            });
                }
            },
            ...

那么您的 Event 对象将如下所示:

const Event = new GraphQLObjectType({
    name: 'Event',
    description: 'This represents an Event',
    fields: () => ({

        ...

        isAttending: {
            type: GraphQLBool,
            resolve: (event) => {
                return event.getAttendees({
                    where: {
                        id: event.currentUserId // that's the parameter you've passed through parent resolve
                    }
                }).then(attendee => {
                    return (attendee.length > 0 ? true : false);
                });
            }
        }
    })
});