使用Relay

时间:2016-09-30 04:56:17

标签: javascript graphql relay graphql-js

我希望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传递给适用于标准查询和节点的解析器?

1 个答案:

答案 0 :(得分:0)

由于 graphql-js v0.6 ,每个解析器都会收到context个对象作为第三个参数。这适用于将上下文信息从服务器传递到GraphQL的执行阶段。例如,我们使用它来处理身份验证和授权。你可以在那里传递所需的语言。如果您使用 express-graphql koa-graphql ,则默认情况下会将request对象作为context传递。您可以检查解析器中的标题。

编辑:以下是使用express-graphql在graphql解析器中处理会话的示例:express-graphql