如何统一nestjs装饰师 [英] How to unify nestjs decorators
本文介绍了如何统一nestjs装饰师的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有两个装饰器:
export const PlainBodyDecode = createParamDecorator(
async (_, context: ExecutionContext) => {
const req = context.switchToHttp().getRequest();
if (!req.readable) {
throw new BadRequestException('Invalid body');
}
const body = (await rawBody(req)).toString('utf8').trim();
return decode(body);
},
);
export const PlainBody = createParamDecorator(
async (_, context: ExecutionContext) => {
const req = context.switchToHttp().getRequest();
if (!req.readable) {
throw new BadRequestException('Invalid body');
}
return (await rawBody(req)).toString('utf8').trim();
},
);
如您所见,它们非常相似。
我真的很希望能够做这样的事情:
export const PlainBodyDecode = createParamDecorator(
decode(PlainBody());
);
如果您明白我的意思。
我是如何使用装饰器的:
@Post('decode')
decode(@PlainBodyDecode() data: any): string {
//...
}
您有什么想法吗?
更新:
我想我需要这样做:
export const PlainBodyDecode = (decodeBody = true): ParameterDecorator => {
return createParamDecorator(async (_, context: ExecutionContext) => {
//...
if (decodeBody) {
return decode(body);
} else {
return body;
}
});
};
但似乎不起作用
推荐答案
以下是使用自定义参数解析器的示例:
您可以在装饰器中添加您自己的自定义逻辑
export const RequestHeader = createParamDecorator(
async (value: any, ctx: ExecutionContext) => {
// extract headers
const headers = ctx.switchToHttp().getRequest().headers;
// Convert headers to DTO object
const dto = plainToClass(value, headers, {excludeExtraneousValues: true});
const errors: ValidationError[] = await validate(dto);
if (errors.length > 0) {
//Get the errors and push to custom array
let validationErrors = errors.map(obj => Object.values(obj.constraints));
throw new HttpException(`Request Header Validation failed with following Errors: ${validationErrors}`, HttpStatus.BAD_REQUEST);
}
// return header dto object
return dto;
}
);
//Using in controller:
@Post('my-details')
async myData(
@Req() req,
@Res() res,
@Body() body: myBody,
@RequestHeader(MyHeaderDto) myHeader: MyHeaderDto,
):Promise<MyCustomDataDto> {
注意:我在这里使用的是打字脚本。
这篇关于如何统一nestjs装饰师的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文