通过 Apollo Server (NestJS) 处理异常

Posted

技术标签:

【中文标题】通过 Apollo Server (NestJS) 处理异常【英文标题】:Processing an exception through 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 模块。

【问题讨论】:

【参考方案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:请发布一个包含所有细节的新问题,谢谢。

以上是关于通过 Apollo Server (NestJS) 处理异常的主要内容,如果未能解决你的问题,请参考以下文章

NestJS GraphQL 数据源

如何使用 NestJS GraphQL 实现 NuxtJS Apollo

Nestjs 中的 Graphql Apollo 上传返回无效值

nodejs升级后运行apollo服务器的问题(使用nestjs和fastify)

elastic APM 和 NestJS 不区分 graphql 查询

在nestjs应用程序中使用新的阿波罗服务器版本的打字稿错误