我在TypeORM和MongoDB中苦苦挣扎。我从几个月以来一直使用这个库,但是我遇到了一个不常见的问题。
保存实体时,有时会更新我的数据,有时不会。完全相同的请求第一次不会起作用,但是第二次会起作用。我使用save()进行更新和插入。插入时一切都很好。
这是我的代码(带有NestJS的TypeORM):
==>实体
@Entity()
export class User {
@ObjectIdColumn()
@Type(() => String)
id: ObjectID;
@Column()
address: string;
}
==> DTO
export class UpdateUserDto {
@IsNotEmpty({ message: () => translate('validation.is_not_empty') })
address: string;
}
==>控制器
@Put(':userId')
@Authentified()
async update(@Param('userId') userId, @Body() dto: UpdateUserDto) {
return await this.usersService.update(userId, dto);
}
==> usersService:
import { MongoRepository } from 'typeorm';
...
private readonly userRepository: MongoRepository<User>
...
async update(userId: string, dto: UpdateUserDto): Promise<User> {
const user = await this.userRepository.findOneOrFail(userId);
user.address = dto.address;
return await this.userRepository.save(user);
}
在save()之后找到find()时,我的用户地址未更新,而我从Mongo收到了ModifyCount1。 如果我再次请求,这次它正在运行...
有什么想法吗?
答案 0 :(得分:0)
几个月后,我终于明白了...
在我的NodeJS Auth中间件中,我记录了一个时间戳以存储用户最后一次连接到API的时间。这意味着我在中间件和服务中两次使用了save()!有时之所以起作用,是因为保存时间戳足够快,可以让我的服务保存更新,有时却不能。而不是使用save(),我将updateOne()与$ set一起使用,不再有并发问题。
我回答了我自己的问题,希望这对其他人有帮助!