Как работать с версией документа Mongoose Ошибка - PullRequest
0 голосов
/ 02 мая 2018

Я получаю эту ошибку при обновлении того же документа. Я постоянно получаю данные из сокета и обновляю документ. Но последние данные еще не были обновлены и по сокету выпускают новые данные для того же документа. Так, как я мог обработать эту ошибку или ждать обратного вызова для того документа?

{ 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);
    }
  }
});

1 Ответ

0 голосов
/ 14 июля 2018

В сообщении об ошибке указывается, что документ не может быть найден, поэтому, если это собственный запрос, попробуйте заключить его в ObjectId, то есть ObjectId("507f1f77bcf86cd799439011").

Ответ на ваш вопрос о том, как вы можете дождаться документа или справиться с ошибкой, зависит от вашего драйвера БД. Например, если вы используете обещанный-монго:

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}, как описано здесь

Имейте в виду, что входящие сообщения сокетов могут не всегда приходить в том же порядке, в котором они были отправлены, обрабатывать состояние соответствующим образом или использовать очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...