【问题标题】:Handling POST error with Graphql mutations使用 Graphql 突变处理 POST 错误
【发布时间】:2020-02-16 05:32:19
【问题描述】:

我正在使用 Graphql,我想使用惯用的方式来处理来自客户端的错误输入和 Graphql 突变。目前,如果用户尝试提交不符合服务器要求的数据,我的服务器仍会发回 200 响应。

架构

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

解析器

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 状态码?

【问题讨论】:

标签: graphql elixir


【解决方案1】:

使用 Graphql 时,重要的是要记住它没有绑定到 HTTP 协议。它对查询文档进行操作,这些文档可以由客户端以任何方式(HTTP、文件、字符串...)传递,并以结果文档进行响应。

另外,想象一下下面的查询文档:

mutation {
  first: firstMutation,
  second: secondMutation,
}

如果第一个突变错误,但第二个突变成功,400 的状态码会很烦人。

相反,GraphQL 使用结果文档来传递可能的错误,例如:

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

您可以在其中看到第一个提供了结果,而第二个出现了错误。处理此类错误取决于 GraphQL 客户端,而不是传输协议。

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 2020-09-02
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 2016-06-13
    • 2020-04-23
    • 2020-09-03
    • 2020-10-20
    相关资源
    最近更新 更多