NestJS+TypeORM多参数删除请求报错:仅允许作者删除帖子
解决NestJS+TypeORM删除帖子时的类型不兼容问题
问题背景
要实现仅帖子作者可删除对应帖子,调用TypeORM的delete方法时传入{ id, user }作为条件,触发类型不兼容错误:
Argument of type '{ id: number; user: UserEntity; }' is not assignable to parameter of type 'string | number | Date | ObjectID | string[] | number[] | Date[] | ObjectID[] | FindOptionsWhere
'. Types of property 'user' are incompatible.
问题原因
TypeORM的delete方法接收的FindOptionsWhere查询条件中,关联字段(如Board实体的user)需要传入关联实体的主键值,而非完整的UserEntity实例。数据库中Board表仅存储user的外键ID,无法直接用整个实体对象作为查询条件,因此类型校验失败。
解决方案
方案1:通过关联实体的主键构造查询条件
直接使用UserEntity的id作为user字段的查询条件,无需修改实体定义:
// service层代码修改 async deletBoard(id: number, user: UserEntity): Promise<void> { const result = await this.boardRepository.delete({ id, user: { id: user.id } // 传入user的主键值 }); if (result.affected === 0) throw new NotFoundException(`无法找到ID为${id}的帖子`); }
方案2:显式定义外键字段(更直观)
在Board实体中显式声明外键字段,直接用外键字段作为查询条件:
- 修改
Board实体:
@Entity() export class Board extends BaseEntity { @PrimaryGeneratedColumn() id: number; @Column() title: string; @Column() description: string; @Column() status: BoardStatus; // 显式定义外键字段 @Column() userId: number; @ManyToOne((type) => UserEntity, (user) => user.boards, { eager: false }) @JoinColumn({ name: 'userId' }) // 指定关联的外键字段 user: UserEntity; }
- 修改service层代码:
async deletBoard(id: number, user: UserEntity): Promise<void> { const result = await this.boardRepository.delete({ id, userId: user.id }); if (result.affected === 0) throw new NotFoundException(`无法找到ID为${id}的帖子`); }
内容的提问来源于stack exchange,提问作者suo jin
相关产品推荐
相关产品推荐

