通过 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 实现 NuxtJS Apollo
Nestjs 中的 Graphql Apollo 上传返回无效值
nodejs升级后运行apollo服务器的问题(使用nestjs和fastify)