node.js - GraphQL - 向 ObjectType 传递参数

标签 node.js express graphql graphql-js

我正在使用GraphQL它工作得很好,但是,我似乎不知道如何将参数传递到 fields我的部分Event GraphQLObjectType

我希望能够传入currentUserId (通过 token 给我)进入 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}] 

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

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

这是最好的解决方案吗?

最佳答案

恐怕你做不到。 fields 不会收到任何参数,因此您也不会发送任何参数。

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

父类型 (Query) 在 resolve 函数中返回的所有内容都在子解析的 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);
                });
            }
        }
    })
});

关于node.js - GraphQL - 向 ObjectType 传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39152749/

相关文章:

graphql - 如何设置 Apollo GraphQL 服务器接受对象作为突变变量?

在 IIS Express 下运行的 Node.js 不断崩溃

javascript - 即使正确渲染,EJS 变量也会引发错误

html - 包含 CSP 随机数的服务器端呈现页面的 ETag

javascript - 为什么更新 MongoDb 时出错?

javascript - 尝试在 Node 中使用 request.js 库时出现错误

graphql - Relay中如何动态改变网络层

node.js - 使用 webpack 时 Node 找不到模块 "fs"

node.js - Node.js 的内部服务器错误

error-handling - 未处理的PromiseRejectionWarning : Error: You must `await server.start()` before calling `server.applyMiddleware()` at ApolloServer