使用GraphQL查询从多语言架构中获取本地化数据

时间:2018-09-21 14:10:46

标签: javascript graphql apollo-server express-graphql

我有以下MongoDB模式。

Item {
  _id: ObjectId,
  translations: [{
    language: String
    name: String
  }]
}

所以我的Item实例可能看起来像这样。

{
  _id: ObjectId("5ba3bf09d3121aba3ba2f488"),
  translations: [
  {
    language: "en"
    name: "a Car"
  },
  {
    language: "de",
    name: "der Wagen"
  }]
}

我希望能够以这种方式使用Graphql查询特定语言的数据。

{
  item(where: {language: "en"}) {
    name
  }
}

因此它将产生具有这样形状的漂亮输出。

{
  name: "a Car"
}

请您告诉我一些好的做法或好的方法来设置我的Graphql解析器映射吗?

我正在使用Apollo Server。

非常感谢您!

1 个答案:

答案 0 :(得分:0)

针对特定语言的查询(具有多个字段)的一般解决方案可能是:

  • 将language参数传递给查询解析器
  • 将语言存储在解析器上下文中
  • 在需要的地方使用上下文中的语言

查询:

query {
  item(language: "en") {
    name
    otherField
  }
}

解析器:

{
  item: (_, { language }, context) => {
    context.language = language;
    return {
      name: (_, context) => getNameByLang(context.language),
      otherField: (_, context) => getOtherByLang(context.language),
    };
  },
}

或者只有一个翻译字段:

query {
  item {
    name(language: "en")
  }
}

因此您可以直接在名称解析器中将语言作为参数。

{
  item: () => ({
    name: ({ language }) => getNameByLang(language),
  })
}