我正在浏览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,
})),
这里为什么我们没有使用匿名函数?这是因为将值传递给上下文还是将值传递给根?
在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
以生成将使用的实际中间件函数之前访问req
和res
,因此我们必须这样做。
但是,这也是不必要的,因为graphqlHTTP本身接受一个函数,该函数将值作为参数传递给req和res。我认为回调函数中没有包含res,因此在这些情况下,这是一个合适的解决方法。