NestJS使用nestjs/crud时如何重写createOne响应新增token字段
NestJS nestjs/crud 重写createOne接口新增token字段解决方案
问题根因
你的写法存在3个核心问题:
- 调用
createOneBase前你手动构造的userDto的id是无效值:id是数据库自增生成,请求体dto中不存在该字段,提前构造没有意义 createOneBase方法执行后会返回数据库存储的User实体实例,你的User实体没有定义token字段,该字段会直接丢失@Crud默认使用你配置的model.type=User做返回序列化,额外的token字段会被自动过滤
修复方案
步骤1:修改Crud配置指定序列化DTO
在@Crud装饰器中新增serialize配置,指定返回序列化使用带token字段的UserDTO:
@Crud({ model: { type: User, }, // 新增序列化配置 serialize: { get: UserDTO, create: UserDTO // 明确创建接口返回用UserDTO } })
步骤2:修改重写的createOne逻辑
不要提前构造DTO,先调用基础创建方法拿到数据库生成的用户数据,再拼接token返回:
@Override() async createOne( @ParsedRequest() req: CrudRequest, @ParsedBody() dto: User, ): Promise<UserDTO> { // 先执行原有创建逻辑,拿到数据库返回的完整用户数据 const createdUser = await this.base.createOneBase(req, dto); // 拼接token字段后返回 return { ...createdUser, token: 'TOKEN' // 替换为你实际的JWT生成逻辑即可 }; }
补充说明
生产环境建议不要明文返回password字段,可在User实体的password属性上添加@Exclude()装饰器,序列化时会自动过滤该字段。
内容的提问来源于stack exchange,提问作者Rayder-_-
相关产品推荐
相关产品推荐

