从 graphql yoga 返回状态码

Posted

技术标签:

【中文标题】从 graphql yoga 返回状态码【英文标题】:return status code from graphql yoga 【发布时间】:2018-10-27 16:04:39 【问题描述】:

在我的解析器内部,我在解析器调用之前检查了这个解析器是否受到保护。

如果解析器受到保护,并且用户未登录,我可能会抛出如下错误: return new Error('Token is missing');

这将停止执行请求并返回正确的消息格式,并带有错误字段。


  "data": null,
  "errors": [
    
      "message": "Token is missing",
      "locations": [
        
          "line": 3,
          "column": 3
        
      ],
      "path": [
        "users"
      ]
    
  ]

但响应的状态为 200,这是不正确的。我希望能够选择自己的状态,例如 403。

这是我当前的解析器实现:

const withAuth = authed => (_, args, context, ...rest) => 
    if (!context.token) 
        return new Error('Token is missing');
    

    let result = null;

    try 
        result = jwt.verify(context.token, process.env.HASH);
     catch (__) 
        return new Error('Incorrect token');
    

    const  username, email  = result;
    if (!username || !email) 
        return new Error('Incorrect token');
    

    return authed(_, args,  ...context, user:  username, email  , ...rest);
;


const resolvers = 
    Query: 

        users: withAuth(resolver(User)), //get users from db


我会在 express 中添加一个 before request 中间件,但无法确定调用的是哪个查询,因为所有调用都是针对同一个端点完成的。

我们将不胜感激!

【问题讨论】:

【参考方案1】:

根据 graphql 规范,端点应始终返回状态 200:

http://facebook.github.io/graphql/October2016/#sec-Errors

响应中的错误条目是一个非空的错误列表,其中 每个错误都是一张地图。

如果在请求的操作过程中没有遇到错误,则 结果中不应出现错误条目。

每个错误都必须包含一个带有字符串的关键消息条目 对开发人员的错误描述作为指南 理解并纠正错误。

如果错误可以与请求中的特定点相关联 GraphQL 文档,它应该包含一个带有关键位置的条目 带有位置列表,其中每个位置都是带有键的地图 行和列,都是从 1 开始的正数,描述 相关语法元素的开头。

GraphQL 服务器可能会根据自己的选择提供额外的错误条目 产生更多有用或机器可读的错误,但未来 规范的版本可能会描述额外的错误条目。

如果响应中的数据条目为空或不存在,则错误 响应中的条目不能为空。它必须至少包含一个 错误。它包含的错误应该表明为什么没有数据能够 被退回。

如果响应中的数据条目不为空,则 响应可能包含执行期间发生的任何错误。如果 执行过程中发生错误,它应该包含这些错误。

【讨论】:

以上是关于从 graphql yoga 返回状态码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GraphQL 中设置 http 状态码

错误:响应不成功:收到状态码 400" Graphql

从 Web Api 控制器返回 http 状态码

服务器返回的14种常见HTTP状态码

服务器返回的14种常见HTTP状态码

返回结果的HTTP状态码