javascript - 如何在nestjs的管道中进行自定义响应
问题描述
我在nestjs中制作了如下的HttpExceptionFilter。
import {
ArgumentsHost,
Catch,
ExceptionFilter,
HttpException,
} from '@nestjs/common';
import { Response } from 'express';
@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
catch(exception, host: ArgumentsHost) {
const context = host.switchToHttp();
const response = context.getResponse<Response>();
const status = (exception.getStatus && exception.getStatus()) || 500;
response.status(status).json({
code: status,
success: false,
});
}
}
我将它放入 app.module 以在全球范围内使用它。
@Module({
imports: [
],
controllers: [AppController],
providers: [
AppService,
{
provide: APP_FILTER,
useClass: HttpExceptionFilter,
},
],
})
到目前为止,除了nestjs的管道外,它运行良好。我制作了一个管道,并在其他控制器中使用 @UsePipes 制作了它。
这是我的管道代码。
import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';
@Injectable()
export class SplitEmailPipe implements PipeTransform<string, string> {
transform(value: any, metadata: ArgumentMetadata): any {
let email = '';
try {
email = value.split('@')[1];
} catch (err) {
throw new Error(err);
}
return { email };
}
}
我使用@UsePipes 放置了那个管道。
在这种情况下,管道效果很好。
@Post('/')
@UsePipes(new SplitEmailPipe())
public async signIn(
@Res() res,
@Body() signInDto: SignInDto,
) {
... do something
}
但问题是 HttpExceptionFilter 不起作用。它默认响应nestjs的响应。
你能给我一些关于这个问题的建议吗?
解决方案
发生这种情况是因为您没有从 HttpException 类型中抛出错误,要解决此问题,您应该替换:
import { ArgumentMetadata, Injectable, PipeTransform } from '@nestjs/common';
@Injectable()
export class SplitEmailPipe implements PipeTransform<string, string> {
transform(value: any, metadata: ArgumentMetadata): any {
let email = '';
try {
email = value.split('@')[1];
} catch (err) {
throw new BadRequestException(err);
}
return { email };
}
}
推荐阅读
- python - 我正在尝试加载 BERT“tfbert-large-uncased”,但出现错误“无法加载 config.json 文件”
- asp.net - .NET Entity Framework - 如何导出/导入完整对象图(实体及其所有子对象)
- hql - Sql查询过滤掉重叠日期
- azure-signalr - 无法连接到 Azure SignalR ServerlessHub 实例
- spring-boot - 使用 jsongenerator 在两者之间添加值
- linq - Linq查询以获取具有平均评分的所有项目
- python - 如何在带有“if”语句的“for”循环中包含“else”语句?
- java - 如何在 OnResponse 函数之外使用 Retrofit 响应,以便将其返回到推荐的架构模型?
- apache-spark - Spark 作业卡在 FiCaSchedulerApp 保留容器中
- node.js - ECMAScript 5 及更高版本的访问器