【问题标题】:return status code from graphql yoga从 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 中间件,但无法确定调用的是哪个查询,因为所有调用都是针对同一个端点完成的。

我们将不胜感激!

【问题讨论】:

    标签: express graphql graphql-js express-graphql


    【解决方案1】:

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

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 2014-06-04
      相关资源
      最近更新 更多