使用 gqlgen + go gin 自定义错误状态代码

Meh*_*ano 2 error-handling go graphql go-gin gqlgen

最近,我一直在将 GO REST API 更新为graphQl API,但遇到了无法使用 gqlgen 自定义状态代码的问题。

我得到的回应

标头

Status Code: 200 OK
Run Code Online (Sandbox Code Playgroud)
{ 
data: null,
errors: [
  {message: "Unauthorized access", path: ["..."]}
]
}
Run Code Online (Sandbox Code Playgroud)

预期标题

Status Code: 401 UNAUTHORISED
Run Code Online (Sandbox Code Playgroud)

任何帮助将非常感激!

mor*_*ori 5

假设您有一个gqlgen与此类似的解析器:

func (r *queryResolver) SecretItems(ctx context.Context, userID string,
    password string) ([]SecretItems, error) {
        // ...
        if !isAuthorized(userID, password) {
                return nil, errors.New("Unauthorized access")
        }
        // ...
}
Run Code Online (Sandbox Code Playgroud)

那么所描述的行为是预期的。错误应作为响应正文的一部分返回。

GraphQL 与传输无关。虽然它通常通过 HTTP 提供服务,但也可以通过其他客户端-服务器协议提供服务。处理响应正文中的错误不需要对协议进行任何假设。因此,您不应依赖 HTTP 状态代码。

处理响应正文中的错误还有另一个优点:假设一个请求包含多个查询。他们中有些人成功了,有些人失败了。然后响应可以包含 下的成功查询的结果data以及与 下的失败查询相关的错误errors

参考:

您期望收到 401 状态代码的可能原因

gqlgen 有关身份验证的文档包含返回 401 状态代码的示例。

为什么?这种情况发生在chi http 服务器上用作中间件的 http 处理程序中。GraphQL 解析器不会返回401 状态代码。