2016-09-30 25 views
1

我希望有人在GraphQL/Relay社区遇到此问题。本地化使用中继时的GraphQL结果

我们有一个多语言系统,这意味着结果是本地化的。所以我们有一个叫做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) 
} 

如果存在翻译,则将使用该翻译而不是第e原始值。 这工作正常,直到我们将Relay引入到我们的项目中。

我们要利用继电器的node,并取得了其部分的工作,即:

query { 
    node(id: "SOMETHINGSOMETHING123") { 
    ...b 
    } 
} 
fragment b on Book { 
    id 
    name 
} 

但由于使用node不能带参数,像viewer可以, 没有办法通过的语言。

如何将language parameters传递给解析器,该解析器可以同时处理标准查询和节点?

回答

0

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

编辑:这是使用快递,graphql在graphql分解处理会话的例子:express-graphql

+0

嘿,感谢您的回答。我们正在使用上下文,当我们通过Node ID进行中继查询时,它不起作用。 –

+0

感谢您的编辑。我会编辑我的答案以反映这一点,但这些查询是代表用户抛出的,这意味着我可能需要日语结果,但您可能需要英语。 –