我试图实现一个简单的行为:每当抛出异常时,我都希望将错误作为响应发送。我的天真代码看起来像这样,但根本没有回应:
异常过滤器:
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();
我有什么想念吗?在此先感谢:)
答案 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()
方法中定义特定平台,则此代码应该起作用。但是,如果选择的平台是Fastify
(docs 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');