NestJS 异常过滤器无法捕获 GraphQL 验证异常/错误

问题描述 投票:0回答:1

我有一个 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
      },
exception nestjs gql
1个回答
0
投票

作者的回复救了我。

编辑 - 我使用 formatError 来代替它完成了工作

GraphQLModule.forRoot({ 司机:ApolloDriver,
格式错误:(错误)=> { // 从 Apollo GQL 上下文抛出的错误不会到达 NestJS 过滤器 如果 ( 错误扩展&& error.extensions.code !== 'INTERNAL_SERVER_ERROR' ){ // 在这里记录 } 返回错误 },

© www.soinside.com 2019 - 2024. All rights reserved.