Mongoose VersionError:保存文档时找不到与 id 匹配的文档

dac*_*gen 4 javascript mongoose mongodb node.js

通过“/sync/”API 请求同步用户购物车时,我反复看到以下错误。每当用户更改其购物车的内容时都会调用此方法。

VersionError:在 VersionError.MongooseError [作为构造函数] (/node_modules/mongoose/lib/error/mongooseError.js:13:11) 中,没有找到与 id "2y4b1hq601cd013e0af25e32" 版本 4 modifiedPaths "cart,cart.items,cart.updatedAt" 匹配的文档) at new VersionError (/node_modules/mongoose/lib/error/version.js:18:17) at generateVersionError (/node_modules/mongoose/lib/model.js:398:10) at model.Model.save (/node_modules/ mongoose/lib/model.js:460:27) 在 /controllers/shoppingCart/index.js:48:14 在 /node_modules/mongoose/lib/model.js:4670:16 在 /node_modules/mongoose/lib/utils。 js:258:16 at _hooks.execPost (/node_modules/mongoose/lib/query.js:4065:11) at /node_modules/kareem/index.js:135:16 at process._tickCallback (internal/process/next_tick.js :61:11)

确切的代码行如下:

req.session.save();
delete user.__v;
>>      user.save();
return res.send();
Run Code Online (Sandbox Code Playgroud)

我试过 user.increment() 但这似乎没有解决这个问题,也没有删除 user.__v 我假设这是冲突的版本,我想对我的用户对象进行版本控制,我只需要强制购物车始终同步到最新版本。

dac*_*gen 14

虽然看起来.save()是这里的正确方法,但.update()命令将完成工作,同时忽略导致此错误发生的“竞争条件”。Mongo DB 抛出此错误是因为它担心我正在保存已更新的旧版本文档:

  1. v1 发送到客户端
  2. v1 被保存,并在 Mongo DB 中更新为 v2
  3. v1 正在尝试再次保存,但 Mongo DB 已经存储了 v2,抛出错误

更好的方法是将 v1 发送到客户端,当购物车对象发生变化时,无论如何都要将对象与新的购物车对象同步。这可以通过.update()而不是通过.save() 来完成

这是因为.save()监视并关心版本控制,而.update()将更新对象而不管版本控制。