Локализация результатов GraphQL при использовании Relay

#javascript #graphql #relay #graphql-js

#javascript #graphql #реле #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 can не может принимать аргументы, подобные viewer can,
нет способа передать язык.

Как мне перейти language parameters к распознавателю, который будет работать как со стандартными запросами, так и с узлами?

Ответ №1:

Начиная с graphql-js версии 0.6, каждый преобразователь получает context объект в качестве третьего параметра. Это хорошо для передачи контекстной информации с сервера на этап выполнения GraphQL. Мы используем его, например, для обработки аутентификации и авторизации. Вы могли бы передать там нужный язык. Если вы используете express-graphql или koa-graphql, они передают request объект как context по умолчанию. Вы можете просмотреть заголовки из распознавателя.

РЕДАКТИРОВАТЬ: вот пример обработки сеанса в преобразователе graphql с использованием express-graphql: express-graphql

Комментарии:

1. Привет, спасибо за ответ. Мы используем контекст, он просто не будет работать, когда мы запрашиваем через идентификатор узла для Relay.

2. Спасибо за редактирование тоже. Я отредактирую свой ответ, чтобы отразить это, но эти запросы выдаются как бы от имени пользователя, что означает, что мне могут понадобиться результаты на японском языке, но вы можете захотеть их на английском.