【问题标题】:Accessing the request object with express-graphql使用 express-graphql 访问请求对象
【发布时间】:2018-03-01 17:36:03
【问题描述】:

根据

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
  })
);

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

【问题讨论】:

    标签: graphql graphql-js express-graphql


    【解决方案1】:

    都不是:)

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

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

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

    1. 参数
    2. 上下文
    3. 信息

    但是,当你走上述路线时,你会丢失第一个参数......因为我想我们不能将 root 传递给它自己

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

    【讨论】:

    • 哦,伙计,非常感谢您-这实际上是我遇到的其他一些困惑。所以我以这种方式传递我的解析器,来自graphql-tools github.com/arackaf/booklist/blob/feature/add-graphQL/… 你是说我可以采取另一条路线,它没有我的模式作为字符串,并且会影响我的解析器参数?所以如果有人走那条路,那么root的价值是什么?我仍然可以指定它,文档提到“根解析器”,但我不太明白这意味着什么 - 我认为它是用于静态全局帮助器或其他东西:-P
    • 我很确定只有次您会看到第一个参数删除是在rootValue 中定义解析器时。据我了解,rootValuecontext 可用之前的剩余部分——现在它的用途有限......除非你选择使用buildSchema,在这种情况下,这是你可以通过的唯一方式解析器。 Example here。如果你已经在使用graphql-tools,你可能不需要弄乱rootValue。
    • 用几个示例链接编辑答案。
    猜你喜欢
    • 2018-02-18
    • 2022-07-04
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2019-01-11
    • 2011-01-02
    相关资源
    最近更新 更多