【问题标题】:Processing an exception through Apollo Server (NestJS)通过 Apollo Server (NestJS) 处理异常
【发布时间】:2020-09-03 23:24:19
【问题描述】:

有没有办法通过 apollo 异常处理程序手动运行异常?

我在 GraphQL 中有 90% 的应用程序,但仍然有两个模块作为 REST,我想统一处理异常的方式。

所以 GQL 查询抛出标准 200 错误数组,其中包含消息、扩展等。

{
  "errors": [
    {
      "message": { "statusCode": 401, "error": "Unauthorized" },
      "locations": [{ "line": 2, "column": 3 }],
      "path": [ "users" ],
      "extensions": {
        "code": "INTERNAL_SERVER_ERROR",
        "exception": {
          "response": { "statusCode": 401, "error": "Unauthorized" },
          "status": 401,
          "message": { "statusCode": 401, "error": "Unauthorized" }
        }
      }
    }
  ],
  "data": null
}

REST 使用 JSON 抛出真正的 401:

{
    "statusCode": 401,
    "error": "Unauthorized"
}

那么我可以简单地捕获并以 Apollo 服务器格式包装异常,还是必须手动格式化我的 REST 错误?谢谢

我正在使用 NestJS 和 GraphQL 模块。

【问题讨论】:

    标签: node.js exception graphql nestjs apollo-server


    【解决方案1】:

    您可以设置一个自定义exception filter,它会捕获 REST-Api 错误并将它们包装为 Apollo Server 格式。比如:

    @Catch(RestApiError)
    export class RestApiErrorFilter implements ExceptionFilter {
        catch(exception: RestApiError, host: ArgumentsHost) {
            const ctx      = host.switchToHttp();
            const response = ctx.getResponse();
            const status   = 200;
            response
                .status(status)                
                .json(RestApiErrorFilter.getApolloServerFormatError(exception);
    }
    
    private static getApolloServerFormatError(exception: RestApiErrorFilter) {
        return {}; // do your conversion here
    }
    

    【讨论】:

    • 是的,这听起来足够好,我正在考虑这个解决方案,但我必须自己进行转换 - 我希望我能以某种方式执行 Apollo 服务器错误处理程序,以便它为我完成大部分转换...
    • 哦,好吧,我错过了,对不起!也许你可以导入这个错误类(github.com/apollographql/apollo-server/blob/…)并抛出这样一个错误实例?然后它应该被相应的错误处理程序捕获:github.com/apollographql/apollo-server/blob/master/packages/…
    • 看起来很有希望!非常感谢 - 这周我会试一试!
    • 对我来说,response.status 不是一个函数 :(
    • @SerShubham:请发布一个包含所有细节的新问题,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 2020-10-20
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2019-04-25
    相关资源
    最近更新 更多