2

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

如果解析器受到保护,并且用户未登录,我可能会抛出如下错误: 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 中间件,但是没有办法知道正在调用哪个查询,因为所有调用都是针对同一个端点完成的。

任何输入将不胜感激!

4

1 回答 1

1

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

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

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

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

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

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

GraphQL 服务器可能会提供额外的错误条目,因为它们选择产生更有帮助或机器可读的错误,但是未来版本的规范可能会描述额外的错误条目。

如果响应中的数据条目为空或不存在,则响应中的错误条目不得为空。它必须包含至少一个错误。它包含的错误应该表明为什么无法返回数据。

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

于 2018-05-17T12:32:50.653 回答