使用express-graphql访问请求对象

时间:2017-09-20 15:11:35

标签: graphql graphql-js express-graphql

根据

http://graphql.org/graphql-js/authentication-and-express-middleware/

  

要将中间件与GraphQL解析器一起使用,只需像使用普通Express应用程序一样使用中间件。然后,请求对象可用作任何解析器中的第二个参数。

然而,当我运行我的解析器时

module.exports = {
  Query: {
    books(root, args, context) {
      return books;
    }
  }
};

第二个参数是我的查询参数。但是,除非我将context配置属性覆盖为expressGraphql,否则第三个参数确实是我的请求对象。

我的完整配置是

app.use(
  "/graphql",
  expressGraphql({
    schema,
    graphiql: true
  })
);

文档是错误的,还是我做错了什么?

1 个答案:

答案 0 :(得分:2)

都不是:)

即使使用普通的'GraphQL.js构建模式(而不是使用graphql-tools或其他库),也可以通过几种不同的方式传递解析器。

您可以通过创建GraphQLSchema对象来生成它,例如,在这种情况下,您的解析器会包含在您添加到它的GraphQLObjectType中。这是repo就是这样做的。

或者,您可以使用带有buildSchema的字符串声明架构。你可以看到完成in the docs。如果你走这条路线,传递你的解析器的唯一方法是利用传递到你的端点配置的rootValue对象。通常,传递给解析器的值参数是

  1. ARGS
  2. 上下文
  3. 信息
  4. 然而,当你走上述路线时,你会丢失第一个参数...因为我想我们不能将root传递给自己

    这是一个很好的说明,为什么,如果你要以声明方式生成模式,graphql-tools是要走的路。