提问者:小点点

express GraphQL中根值和上下文之间的差异


我正在浏览GraphQL Express文档,在这些文档中有一个根值和上下文的定义,如下所示

rootValue:要作为rootValue从graphql传递给graphql()函数的值。js/src/execute。js。

context:要作为上下文从graphql传递给graphql()函数的值。js/src/execute。js。如果未提供上下文,则将请求对象作为上下文传递。

现在,有人能解释一下上面rootValue和context之间的区别吗?

此外,由于我的新Express和GraphQL以及。

我在网上看到的一个例子,有一个人做了这样的事情

// GraphQL setup
app.use("/user", async  (req, res) => graphqlHTTP({
  schema: userSchema, //TODO: Change it authentication once it is ready
  graphiql: true,
  context: {req, res}
})(req, res)) 

注意上面一行中的}(req,res)),它看起来像这样,我相信这是一个annyonmousfunction,它自己被调用?

在官方express GraphQL示例中,我找不到类似的内容,即引用官方文档

app.use(
  '/graphql',
  graphqlHTTP(async (request, response, graphQLParams) => ({
    schema: MyGraphQLSchema,
    rootValue: await someFunctionToGetRootValue(request),
    graphiql: true,
  })),

这里为什么我们没有使用匿名函数?这是因为将值传递给上下文还是将值传递给根?


共1个答案

匿名用户

在GraphQL中。上下文是一个特定于服务的对象,传递给模式中的每个解析器。它是基于每个请求构建的,因此可以包括会话信息、关于发出请求的用户的信息等。它还常用于依赖注入。例如,您通常会看到传递给上下文的数据库模型,这样就可以在解析器中访问它们,而无需要求它们的模块。

每个解析器都将其父字段解析为的值作为其第一个参数传递。在根级别字段的情况下,如Query突变类型,没有父字段。值只是传递给这些解析器的值。在我看来,很少需要通过根值提供任何值。

Express使用接受三个参数(req、res、next)或四个参数(error、req、res、next)的中间件函数。您传递给应用程序的内容。使用应该是一个中间件功能。graphqlHTTP函数本身不是一个中间件函数,它返回一个中间件函数。

考虑以下示例:

const foo = (req, res, next) => {
  res.status(200)
}
app.use(foo)

// Here the function inside app.use is the actual middleware, but it passes
// the values it receives to foo
app.use((req, res, next) => foo(req, res, next))

// This returns a middleware function
const bar = () => {
  return (req, res, next) => {
    res.status(200)
  }
}
// Notice we have to call bar first, just like we do with graphqlHTTP
app.use(bar())

// We can "wrap" bar inside another middleware function like we did with foo
app.use((req, res, next) => bar()(req, res, next))

这四个例子是等价的,因为它们都做同样的事情(在请求时将状态设置为200)。

给定一个中间件函数或返回一个中间件函数的函数,通常不需要将其“包装”或“嵌套”在另一个中间件函数中。但是,在您的示例中,我们希望在调用graph qlHTTP以生成将使用的实际中间件函数之前访问reqres,因此我们必须这样做。

但是,这也是不必要的,因为graphqlHTTP本身接受一个函数,该函数将值作为参数传递给req和res。我认为回调函数中没有包含res,因此在这些情况下,这是一个合适的解决方法。