javascript - Mongoose版本错误: No matching document found for id when document is being saved

标签 javascript node.js mongodb mongoose

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

VersionError: No matching document found for id "2y4b1hq601cd013e0af25e32" version 4 modifiedPaths "cart, cart.items, cart.updatedAt" at VersionError.MongooseError [as constructor] (/node_modules/mongoose/lib/error/mongooseError.js:13:11) 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) at /controllers/shoppingCart/index.js:48:14 at /node_modules/mongoose/lib/model.js:4670:16 at /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();

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

最佳答案

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

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

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

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

关于javascript - Mongoose版本错误: No matching document found for id when document is being saved,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54792749/

相关文章:

javascript - Mongoose 将请求对象传递给中间件

node.js - 错误 :a hook ('orm' ) failed to load when lifting sails app using mongo DB

mongodb - 无法从 AWS EC2 实例连接到 Mlab.com 数据库

python - PyMongo 与 Django 和 uwsgi

javascript - 当属性可能不存在时,与数组中的对象属性不同的值

node.js - 有没有人使用 Chrome Lighthouse Node CLI 来自动运行审计(尤其是可访问性)?

javascript - JSDoc:如何记录具有动态和固定属性混合的对象?

javascript - 无法访问另一个函数上的 session 状态数据

javascript - 点击剪贴板动画

javascript - React 不更新文本(.getDOMNode() 的问题)