【问题标题】:NestJs - Send Response from Exception FilterNestJs - 从异常过滤器发送响应
【发布时间】:2018-11-22 16:20:09
【问题描述】:

我正在尝试实现一个简单的行为:每当抛出异常时,我想将错误作为响应发送。我这种幼稚的代码看起来像这样,但根本没有响应:

异常过滤器:

import { ExceptionFilter, ArgumentsHost, Catch } from '@nestjs/common';

@Catch()
export class AnyExceptionFilter implements ExceptionFilter {
  catch(exception: any, host: ArgumentsHost) {
    return JSON.stringify(
      {
        error: exception,
      },
      null,
      4,
    );
  }
}

模块

@Module({
  imports: [],
  controllers: [AppController, TestController],
  providers: [AppService, AnyExceptionFilter],
})
export class AppModule {}

ma​​in.ts

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new AnyExceptionFilter());
  await app.listen(1212);
}
bootstrap();

有什么我想念的吗?在此先感谢:)

【问题讨论】:

    标签: exception-handling nestjs


    【解决方案1】:
    import { ExceptionFilter, Catch, HttpException, ArgumentsHost, HttpStatus } from '@nestjs/common';
    
    @Catch()
    export class AnyExceptionFilter implements ExceptionFilter {
      catch(error: Error, host: ArgumentsHost) {
    
        const response = host.switchToHttp().getResponse();
    
        const status = (error instanceof HttpException) ? error.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR;
    
        response
          .status(status)
          .json(error);
      }
    }
    

    这段代码对我来说似乎工作正常。

    嵌套版本:5.0.1

    【讨论】:

      【解决方案2】:

      只需添加有关先前答案的更多信息。 @oto-meskhy here 提供的建议代码是(复制它只是为了完成目的 - 归功于@oto-meskhy):

      import { ExceptionFilter, Catch, HttpException, ArgumentsHost, HttpStatus } from '@nestjs/common';
      
      @Catch()
      export class AnyExceptionFilter implements ExceptionFilter {
        catch(error: Error, host: ArgumentsHost) {
      
          const response = host.switchToHttp().getResponse();
      
          const status = (error instanceof HttpException) ? error.getStatus() : HttpStatus.INTERNAL_SERVER_ERROR;
      
          response
            .status(status)
            .json(error);
        }
      }
      
      

      如果您的 NestJS 应用程序未在 NestFactory.create() 方法中定义特定平台,则此代码应该可以工作。但是,如果选择的平台是Fastify (docs here),请注意上面的一小段代码将不起作用,更具体地说:

          ...
          response
            .status(status)
            .send(object)
      

      在这种情况下,您的应用程序代码应该稍作更改以使用FastifyReply methods,如下所示:

          // fastify
          response
            .code(status)
            .send(error);
      

      【讨论】:

        【解决方案3】:

        catch 必须使用 response 对象将某些内容发送回客户端:

        const ctx = host.switchToHttp();
        const response = ctx.getResponse();
        
        response
          .status(status)
          .send('Hello');
        

        【讨论】:

        • 我已经尝试过了,但由于某种原因这似乎不起作用。响应对象甚至没有一个名为“状态”的函数。 :-(
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-30
        • 2021-03-06
        • 2021-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多