我有一个 NestJS 异常过滤器。但是,它不会捕获任何 GQL 异常。例如,如果我在 GQL 输入中遗漏了必填字段,则会从 NestJS 服务向客户端发送回 BAD_INPUT 或 GRAPHQL_VALIDATION_FAILED 异常错误,但不会调用异常过滤器。
应用程序内其他与服务相关的异常会调用异常过滤器,但 GQL 验证异常不会被调用。
我有一种感觉,这可能是因为它们在 NestJS 有机会包装上下文之前就被扔进了 Apollo 上下文中。如果是这种情况,那么我如何捕获 GQL 验证异常(以记录它们)?
@Catch()
export class CustomExceptionFilter implements ExceptionFilter {
constructor(private readonly logger: Logger) {}
catch(exception: any, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse();
this.logger.error(Exception occurred (logged from filter): ${exception}, exception.stack);
response.status(500).json({
statusCode: 500,
message: 'Internal Server Error',
})
}
}
编辑 - 我使用 formatError 来代替它完成了工作
GraphQLModule.forRoot<ApolloDriverConfig>({
driver: ApolloDriver,
formatError: (error) => {
// Errors thrown from the Apollo GQL context won't reach NestJS filters
if (
error.extensions &&
error.extensions.code !== 'INTERNAL_SERVER_ERROR'
) {
// log here
}
return error
},
作者的回复救了我。
编辑 - 我使用 formatError 来代替它完成了工作
GraphQLModule.forRoot({ 司机:ApolloDriver,
格式错误:(错误)=> { // 从 Apollo GQL 上下文抛出的错误不会到达 NestJS 过滤器 如果 ( 错误扩展&& error.extensions.code !== 'INTERNAL_SERVER_ERROR' ){ // 在这里记录 } 返回错误 },