Nestjs中TypeORM(PostgreSQL)的UPDATE更新操作如何正确实现?
问题解决步骤
- 第一步:提取正确的profile_id值
你打印出来的profile_id是对象结构,说明你在controller层调用updateprofile方法时,直接把整个请求参数对象(比如路由params对象)传进来了,没有提前解构取值。你可以直接在service方法内提取id:
const targetId = profile_id.profile_id;
也可以直接修正方法的参数定义,直接解构拿到id,避免后续类型报错:
async updateprofile({ profile_id }: { profile_id: string }, data: any): Promise<any>
- 第二步:修正TypeORM的update方法调用
TypeORM的Repository类的update方法需要传入两个参数:第一个是匹配要更新行的查询条件,第二个是要更新的字段数据,你之前漏传了匹配条件所以语法错误。
完整的修正后代码如下:
async updateprofile({ profile_id }: { profile_id: string }, data: any): Promise<any> { try { // 第一个参数传匹配条件,按主键匹配要更新的行 // 如果你的Profile实体主键字段名不是id而是profile_id,就改成{ profile_id: profile_id } await this.profileRepository.update({ id: profile_id }, data); return { success: true, message: 'Successfully updated profile', }; } catch (err) { // 可按需补充错误抛出、日志打印逻辑 throw err } }
- 第三步:save方法新增行的原因说明
save方法的执行逻辑是:如果传入的实体对象包含主键字段,就执行更新操作;如果没有主键字段,就执行插入操作。你之前调用save时没有把id合并到data里,所以TypeORM判断为新数据直接插入,就出现了新增行触发唯一约束报错的问题。如果要用save实现更新可以这么写:
await this.profileRepository.save({ ...data, id: profile_id });
注意:update方法是直接执行SQL的UPDATE语句,不会先查询实体再操作,性能更好;save方法会先查询实体是否存在,存在才更新,适合需要触发实体生命周期钩子(比如@BeforeUpdate)的场景。
内容的提问来源于stack exchange,提问作者ANTO P V
相关产品推荐
相关产品推荐

