使用Graphql突变处理POST错误

时间:2019-10-19 13:14:04

标签: graphql elixir

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

SCHEMA

declare var pool: Pool;

RESOLVER

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

1 个答案:

答案 0 :(得分: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客户端要处理此类错误,而不是传输协议。