当前位置: 首页 > 知识库问答 >
问题:

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

高砚
2023-03-14

我正在浏览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个答案

齐起运
2023-03-14

在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,因此在这些情况下,这是一个合适的解决方法。

 类似资料:
  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 我来自Java背景,刚接触Scala。 我正在使用Scala和Spark。但是我不明白我在哪里使用和。 有人能告诉我在哪种情况下我需要使用这两个操作符吗?和之间有什么区别吗?

  • 我编写了一个简单的脚本,它接受任意数量的参数来演示< code>$@和< code>$*之间的区别: 在我做的 CLI 上 这就是打印出来的 因为它们是相同的,这是否意味着等于?还是我遗漏了一点?

  • 我试图理解西农图书馆的假、间谍、存根和模拟之间的区别,但无法清楚地理解。 有人能帮我了解一下吗?

  • 问题内容: 使用ng-if与值或函数有什么区别吗? 更新(为了更好地理解我为什么要) html js 如果我这样使用,我已经达到了$ digest()迭代 重新更新 (对于chandermani评论) 问题答案: 对于角度都是,它将在当前范围内进行评估。Angular在每个摘要周期执行此操作。 如果您使用的是功能方式,则还有更多的射击方法。可以做 在这种情况下,对每个摘要循环的绑定评估会使您的绑定

  • client.query和Table.query之间有什么区别 在这种情况下,client.query应具有比Table.query更高的权限,反之亦然 在AWS留档我遇到了几个点其中之一 如果满足查询条件的项目总数超过结果集大小限制1 MB,则查询将停止,并将结果返回给用户,并使用LastEvaluatedKey元素在后续操作中继续查询。与扫描操作不同,查询操作从不同时返回空结果集和LastEv