代码之家  ›  专栏  ›  技术社区  ›  Adam

graphql yoga返回状态代码

  •  2
  • Adam  · 技术社区  · 8 年前

    从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 回复  |  直到 8 年前
        1
  •  1
  •   Adam    8 年前

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

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

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

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

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

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

    GraphQL服务器可以根据自己的选择提供额外的错误条目 产生更有用或机器可处理的错误 规范的版本可能会描述错误的其他条目。

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

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

    推荐文章