【问题标题】:Localizing GraphQL results when using Relay使用 Relay 时本地化 GraphQL 结果
【发布时间】:2017-02-08 14:02:18
【问题描述】:

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

【问题讨论】:

    标签: javascript graphql relay graphql-js


    【解决方案1】:

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

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

    【讨论】:

    • 您好,谢谢您的回答。我们正在使用上下文,当我们通过节点 ID 查询中继时它不起作用。
    • 也感谢您的编辑。我将编辑我的答案以反映这一点,但这些查询是代表用户抛出的,这意味着我可能想要日文的结果,但你可能想要英文的结果。
    猜你喜欢
    • 2016-02-10
    • 2017-04-19
    • 2018-01-26
    • 2016-05-29
    • 2016-07-26
    • 2020-12-02
    • 2018-02-12
    • 2015-11-27
    • 1970-01-01
    相关资源
    最近更新 更多