node.js - 如何处理 Mongoose 文档版本错误
问题描述
更新同一文档时出现此错误。我不断从套接字获取数据并更新文档。但是最近的数据尚未更新,并且在套接字上发出更新同一文档上的新数据。那么我该如何处理这个错误或等待该文档的回调呢?
{ Error
at model.wrappedPointCut [as save] (/var/www/html/parcel-app/node_modules/mongoose/lib/services/model/applyHooks.js:131:29)
at /var/www/html/parcel-app/server/server.js:372:22
at /var/www/html/parcel-app/node_modules/mongoose/lib/query.js:3115:18
at tryCatcher (/var/www/html/parcel-app/node_modules/bluebird/js/main/util.js:26:23)
at Promise._settlePromiseFromHandler (/var/www/html/parcel-app/node_modules/bluebird/js/main/promise.js:510:31)
at Promise._settlePromiseAt (/var/www/html/parcel-app/node_modules/bluebird/js/main/promise.js:584:18)
at Promise._settlePromises (/var/www/html/parcel-app/node_modules/bluebird/js/main/promise.js:700:14)
at Async._drainQueue (/var/www/html/parcel-app/node_modules/bluebird/js/main/async.js:123:16)
at Async._drainQueues (/var/www/html/parcel-app/node_modules/bluebird/js/main/async.js:133:10)
at Immediate.Async.drainQueues (/var/www/html/parcel-app/node_modules/bluebird/js/main/async.js:15:14)
at runCallback (timers.js:800:20)
at tryOnImmediate (timers.js:762:5)
at processImmediate [as _immediateCallback] (timers.js:733:5)
message: 'No matching document found for id "5ae99a15e5e73b39cacafe48"',
name: 'VersionError' }
这是片段
socket.on('sendUserLocation', function(data) {
//when app send new location of user this method will invoked
if (data !== undefined) {
var lat = data.lat;
var lng = data.lng;
var userType = data.user_type;
var roomName = data.room_name;
var heading = data.heading != undefined ? data.heading : 0;
if (userType == 'db') {
var returnBoj = {
lat: lat,
lng: lng,
user_type:'db',
room_name: roomName,
heading: heading, //heading is degree of db boy which will -180-0-180
};
//finding user by room id which is user document id mongoose
DeliveryboyModel.findById(roomName).exec(function (err, DBData) {
if (DBData) {
locationArray = [ parseFloat(lat) , parseFloat(lng) ];
DBData.locationDetails.location = locationArray;
DBData.save(function (err) {
//getting error here
if (err) {
console.log(err);
}
});
}
});
// emmiting addnewmarker so customer app will get new location and will update pin to new location
socket.emit('addnewmarker', returnBoj);
socket.broadcast.to(roomName).emit('addnewmarker', returnBoj);
}
}
});
解决方案
错误消息提示它找不到文档,因此如果它是本机查询,请尝试将其包装为ObjectId
, 即ObjectId("507f1f77bcf86cd799439011")
.
要回答关于如何等待文档或处理错误的问题取决于您的数据库驱动程序。例如,如果你使用 promise-mongo:
db.collection.update(...).then((doc) => {
// This will run once updated
}).catch((err) => { //handle the error});
阅读更多:https ://github.com/gordonmleigh/promised-mongo
或者,如果您使用的是 mongodb npm 模块:
db.collection.update({_id: ObjectId('yourId'), {updateKey:
'updateVal}, (err,val) => {
if(err) //handle it and return
// update finished
return callback(doc);
});
更多细节在https://www.npmjs.com/package/mongodb
如果问题仍然存在,请尝试使用标志设置查询,如此处{upsert: true}
所述
请记住,传入的套接字消息可能并不总是以它们发送的相同顺序到达,适当地处理状态或使用队列。
推荐阅读
- c# - 在 C# 应用程序中使用 Google Drive Rest API 时获取帐户名或电子邮件
- powershell - 将 *.der 证书导入“其他人”商店
- sql-server - 将 xml 解析为 sql 列
- pandoc - 从 docx [pandoc] 转换时在 EPUB 中创建目录
- python - 如何在python中用group by融化列
- python - 有没有另一种方法可以在 python 中读取 stl 文件?
- python - 如何使用范围将这个 python for 循环转换为 C++?
- c++ - C++:指向向量(及其元素)的指针是否稳定,因为随着向量的增长,向量会在内存中迁移以适应更多元素?
- ruby - RUBY 将单词拆分为字母和数字
- javascript - 未找到此依赖项:* core-js/fn/symbol