我正在使用 NestJS 开发后端(顺便说一句,这太棒了)。我有一个类似于下面这个例子的“标准获取实体情况的单个实例”。
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) {}
..
..
..
@Get(':id')
async findOneById(@Param() params): Promise<User> {
return userService.findOneById(params.id);
}
这非常简单并且有效——但是,如果用户不存在,服务将返回 undefined 并且控制器返回 200 状态代码和空响应。
为了让控制器返回 404,我想出了以下方法:
@Get(':id')
async findOneById(@Res() res, @Param() params): Promise<User> {
const user: User = await this.userService.findOneById(params.id);
if (user === undefined) {
res.status(HttpStatus.NOT_FOUND).send();
}
else {
res.status(HttpStatus.OK).json(user).send();
}
}
..
..
这行得通,但代码更多(是的,它可以重构)。
这真的可以使用装饰器来处理这种情况:
@Get(':id')
@OnUndefined(404)
async findOneById(@Param() params): Promise<User> {
return userService.findOneById(params.id);
}
任何人都知道这样做的装饰器,或者比上面那个更好的解决方案?
原文由 Rich Duncan 发布,翻译遵循 CC BY-SA 4.0 许可协议
最短的方法是
装饰器在这里没有意义,因为它会有相同的代码。
注意:
BadRequestException
是从@nestjs/common
导入的;编辑
一段时间后,我想到了另一个解决方案,它是 DTO 中的装饰器:
然后在你的 DTO 中:
希望它能帮助别人。