我希望GraphQL/Relay
社区中有人遇到此问题。
我们有一个多语言系统,这意味着结果是本地化的。所以我们有一个名为lang
的参数,它被传递给字段解析器。
查询是这样写的:
query {
viewer(lang: ja) {
books { <- Type is `Book`
id
title <- This would be localized to Japanese.
}
}
}
哪会回来:
{
"data": {
"viewer": {
"books": [
{
"id": "SOMETHINGSOMETHING123",
"name": "ハリー・ポッター" // "Harry Potter" in Japanese.
}
]
}
}
}
这是可能的,因为可翻译字段的解析器看起来像这样(注意我使用的是dataloader):
...
resolve: (parent, args, ast, { rootValue }) => {
const { language } = rootValue
const { BookLoader } = rootValue.loaders
return BookLoader.TranslationsLoader(language).load(parent.id).then(translations => translations[parent.id].title || parent.title)
}
如果存在翻译,则会使用该翻译而不是原始值。
在我们将Relay
引入项目之前,这一点工作正常。
我们希望使用Relay的node
,并使其部分有效,即:
query {
node(id: "SOMETHINGSOMETHING123") {
...b
}
}
fragment b on Book {
id
name
}
但由于使用node
无法接受viewer
之类的参数,
没有办法传递语言。
如何将language parameters
传递给适用于标准查询和节点的解析器?
答案 0 :(得分:0)
由于 graphql-js v0.6 ,每个解析器都会收到context
个对象作为第三个参数。这适用于将上下文信息从服务器传递到GraphQL的执行阶段。例如,我们使用它来处理身份验证和授权。你可以在那里传递所需的语言。如果您使用 express-graphql 或 koa-graphql ,则默认情况下会将request
对象作为context
传递。您可以检查解析器中的标题。
编辑:以下是使用express-graphql在graphql解析器中处理会话的示例:express-graphql