NestJs - 从异常过滤器发送响应

时间:2018-06-13 07:18:20

标签: exception-handling nestjs

我试图实现一个简单的行为:每当抛出异常时,我都希望将错误作为响应发送。我的天真代码看起来像这样,但根本没有回应:

异常过滤器:

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 {}

main.ts

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

只需添加有关先前答案的更多信息。 @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()方法中定义特定平台,则此代码应该起作用。但是,如果选择的平台是Fastifydocs here),请注意,上面的一小段代码将不起作用,更具体地说:

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

在这种情况下,您的应用程序代码应稍作更改以使用Fastify的{​​{3}},如下所示:

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

答案 2 :(得分:0)

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

const ctx = host.switchToHttp();
const response = ctx.getResponse();

response
  .status(status)
  .send('Hello');