Apollo GraphQL中的Context vs RootValue

时间:2017-06-03 13:39:34

标签: node.js graphql apollo apollo-server

graphQLOptions中,context和rootvalue有什么区别?

我什么时候应该使用另一个?我应该何时使用另一个?

目前我正在将连接器和其他敏感数据附加到上下文中,这样安全吗?用户可以读取查询的上下文或根值吗?

2 个答案:

答案 0 :(得分:6)

GraphQL类型/字段概念非常递归。通常称为RootQuery的自定义类型与架构中的任何其他类型一样。但是,通常,此RootQuery类型仅包含动态解析的字段,但这不是限制。如果您希望人们访问name类型的字符串标量User字段,则无需为其编写解析器函数,只要该对象解析为任何User返回字段包含name属性;这与RootValue的工作方式相同,但对象将是通过rootValue提供的对象。

另一方面,上下文是每个解析器都可以使用的东西,但是任何用户都不能通过GraphQL服务器发送查询来查询 - 从而使上下文成为保存敏感数据的理想位置,例如会话信息。

<强>示例: 这里是rootValue的示例用法:https://runkit.com/lucasconstantino/graphql-root-value-sample

答案 1 :(得分:3)

RootValue是传递给查询入口点的初始值。默认情况下它是未定义的,但是如果适合您的用例,Apollo允许您使用某些值为查询设定种子。它可以作为解析器函数签名中的第一个参数访问。

context是所有解析器都可以使用的共享参考。通常,它是key / val对的对象,包含有状态外部连接的句柄或者诸如users / auth / etc之类的元关注。

用户(我假设您的意思是客户)只能读取您从解析器返回的内容;上下文未在内省查询中表示。如果您的解析器需要访问权限来履行其职责,那么将敏感数据和连接器(在Apollo范例中)放在那里是安全的。

有关rootValue如何工作的快速演示,请参阅this launchpad