NestJs - 从异常过滤器发送响应
NestJs - Send Response from Exception Filter
我正在尝试实现一个简单的行为:每当抛出异常时,我都想发送错误作为响应。我那种天真的代码看起来像这样,但根本没有响应:
异常过滤器:
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();
有什么想念的吗?提前致谢:)
catch
必须使用 response
对象将某些内容发送回客户端:
const ctx = host.switchToHttp();
const response = ctx.getResponse();
response
.status(status)
.send('Hello');
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
只是添加了一些关于之前答案的信息。 @oto-meskhy is (replicating it just for completion purposes - credits to @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
的 Reply methods,如下所示:
// fastify
response
.code(status)
.send(error);
我正在尝试实现一个简单的行为:每当抛出异常时,我都想发送错误作为响应。我那种天真的代码看起来像这样,但根本没有响应:
异常过滤器:
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();
有什么想念的吗?提前致谢:)
catch
必须使用 response
对象将某些内容发送回客户端:
const ctx = host.switchToHttp();
const response = ctx.getResponse();
response
.status(status)
.send('Hello');
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
只是添加了一些关于之前答案的信息。 @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
的 Reply methods,如下所示:
// fastify
response
.code(status)
.send(error);