从graphql yoga返回状态代码

时间:2018-05-17 11:41:00

标签: express graphql graphql-js express-graphql

从graphql yoga中,我在旋转变压器调用之前检查,如果这个解析器受到保护或不受保护。

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

任何输入都将不胜感激!

1 个答案:

答案 0 :(得分:0)

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

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

  

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

     

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

     

每个错误都必须包含带有字符串的密钥消息的条目   用于指导开发人员的错误的描述   理解并纠正错误。

     

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

     

GraphQL服务器可能会在选择时为错误提供其他条目   产生更多有用或机器可读的错误,但未来   规范的版本可能会描述错误的其他条目。

     

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

     

如果响应中的数据条目不为null,则输入错误条目   响应可能包含执行期间发生的任何错误。如果   执行期间发生错误,应包含这些错误。