Обработка ошибки POST с мутациями Graphql - PullRequest
1 голос
/ 19 октября 2019

Я использую Graphql и хочу использовать идиоматический способ передачи неверного ввода со стороны клиента с помощью мутаций Graphql. В настоящее время, если пользователь пытается отправить данные, которые не соответствуют требованиям сервера, мой сервер все равно отправит ответ 200.

SCHEMA

mutation do
  field :create_team, :team do
    arg(:name, non_null(:string))
    arg(:league_id, non_null(:id))

    resolve(&TeamResolver.create_team/3)
  end 
 end

RESOLVER

def create_team(_root, args, info) do
  Teams.create_team(args, info)
end

КОМАНДНЫЙ КОНТЕКСТ

def create_team(attrs, info) do
  user_id = Auth.current_user_id(info)
  changeset = Team.changeset(%Team{user_id: user_id}, attrs)

  case Repo.insert(changeset) do
    {:ok, team} ->
      {:ok, team}

    {:error, changeset} ->
      {:error, "error"}
  end
end

Проблема в контексте, мы не используем conn, поэтому я не могу put_status(:unproccesable_entity) или что-то в этом роде. Если клиентская сторона отправляет неверные данные, как я могу отправить обратно 4xx код состояния?

1 Ответ

1 голос
/ 19 октября 2019

При использовании Graphql важно помнить, что он не связан с протоколом HTTP. Он работает с документами запросов, которые могут быть доставлены клиентами любым способом (HTTP, Files, Strings ...) и отвечает результатами документов.

Кроме того, представьте себе следующий документ запроса:

mutation {
  first: firstMutation,
  second: secondMutation,
}

Если первая ошибка мутации, но вторая была успешной, раздражает код состояния 400.

Вместо этого GraphQL использует результирующий документ для доставки возможных ошибок, например:

{
  "data": {
    "first": true,
    "second": null
  },
  "errors": [
    {
      "locations": [
        {
          "column": 0,
          "line": 2
        }
      ],
      "message": "some error",
      "path": [
        "first"
      ]
    }
  ]
}

, где вы можете видеть, что первый дал результат, а второй имел ошибку. Обрабатывать такие ошибки должен клиент GraphQL, а не транспортный протокол.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...