我正在使用Graphql,我想使用惯用的方式来处理来自客户端的带有Graphql突变的错误输入。目前,如果用户尝试提交不符合服务器要求的数据,我的服务器仍会发送200响应。
declare var pool: Pool;
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)
状态代码?
答案 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客户端要处理此类错误,而不是传输协议。