如何使用express-graphql-App?

时间:2017-09-14 06:58:18

标签: express internationalization graphql

我正在寻找一个关于图形化响应的例子:我不想将语言传递给每个查询,但我只发现了关于如何将语言放入上下文以获得它的非常稀疏的文档可供解决。

我正在使用node和graphql-express,每个使用此组合或任何其他提示都非常感谢!

2 个答案:

答案 0 :(得分:1)

正如@jamuhl所建议的,这是一个使用i18next将所选语言放在请求上然后使用上下文将其传递给graphql的示例:

首先设置i18next:

const i18next = require('i18next')
// detects language from query, cookies or Accept-Language using i18next
i18next
  .use(i18nMiddleware.LanguageDetector)
  .init({
    preload: ['en', 'de']
   });
app.use(i18nMiddleware.handle(i18next));

下一步是在设置graphql时将其传递给context-object(通常,你的context-object将比这更复杂):

app.use('/api/v1'
        ,graphqlHTTP((req) =>{
          return {
            schema: schema.schema,
            rootValue: schema.root,
            graphiql: false,
            pretty: true,
            context: {language: req.language}
          }
        }));

现在您可以从解析器中的上下文中选择所选语言:

var root = {
    ... 
    yourApiCall: async (query, context, schema) => {
      let language = context.language || "en"
      ...
      return {localizedStrings: ...}
    }

如果您没有明确设置上下文,则将上下文设置为请求:您可以从那里派生出来,但我仍然认为明确控制上下文的风格更好。请检查一下,这个解决方案适用于你的graphql版本 - 这里最费力的部分是找出调用的正确签名,因为graphql在省略配置参数方面往往过于聪明,以便更容易设置因此,大多数示例都缺少此方法正常工作所需的查询,上下文和架构的签名。

答案 1 :(得分:0)

不要深入了解graphql,而是确保您可以使用http://i18next.com解决问题 - >或更具体的快速中间件https://github.com/i18next/i18next-express-middleware