2017-01-14 2 views
0

что я делаю неправильно?Mongoose зависает после использования findOneAndUpdate()

Я использую mongoose и node.js для сохранения некоторых данных в mongodb. Сама программа работает, но меня раздражает то, что после обнаружения и обновления документов программа все еще висит и не закрывается.

Я думаю, что проблематичная часть является функцией обратного вызова в findOneAndUpdate().

У меня есть мангуста модель (simpleModel.js):

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var simpleSchema = new Schema({ 
    a: String, 
    b: String, 
    c: String, 
    somearray: [{index: String}], 
    timestamp: {type: Date, default: Date.now} 
}); 

var Simple = mongoose.model('Simple', simpleSchema); 

module.exports = Simple; 

и главный JS файл (problemSimplified.js):

var mongoose = require('mongoose'); 
var dbURI = 'mongodb://localhost:27017/testing'; 
mongoose.connect(dbURI); 

// CONNECTION EVENTS 
mongoose.connection.on('connected', function() { 
    console.log('Mongoose default connection open to ' + dbURI); 
}); 

mongoose.connection.on('error',function (err) { 
    console.log('Mongoose default connection error: ' + err); 
}); 

mongoose.connection.on('disconnected', function() { 
    console.log('Mongoose default connection disconnected'); 
}); 

// If the Node process ends, close the Mongoose connection 
process.on('SIGINT', function() { 
    mongoose.connection.close(function() { 
    console.log('Mongoose disconnected...'); 
    process.exit(0); 
    }); 
}); 


var Simple = require('./simpleModel.js'); 

function doSomethingAndSave(){ 

    var myArray = [ 
     {a:5,b:4,c:6}, 
     {a:1,b:2,c:3}, 
     {a:0,b:3,c:3} 
    ] 

    myArray.map(function (element,index){ 

    //following is problematic part 
    Simple.findOneAndUpdate(
     //query - this part works correctly 
     {a: element.a, b: element.b, c: element.c}, 
     //insert (update) - this part works correctly 
     { 
      $set: {a: element.a, b: element.b, c: element.c}, 
      $push: {somearray: {index: index}} 
     }, 
     //options - just some settings (i guess it works too) 
     {safe: true, upsert: true, new : true}, 
     //callback function - I guess this part is the problem, but why? 
     function(err, model) { 
      if (err) { 
       console.log(err); 
       strOutput = 'Oh dear, we\'ve got an error'; 
      } else { 
       console.log('updated'); 
      } 
     } 
    ); 
    }) 
} 

doSomethingAndSave(); 

Может кто-нибудь, пожалуйста, объясните мне, почему?

Заранее спасибо.

ответ

0

Я думаю, что это нормальное поведение. Вы можете попробовать закрыть соединение mongoose в успешном обратном вызове findOneAndUpdate().

Для нескольких вставок вам необходимо связать их в обратных вызовах. This объясняет это всем, но это немного чтение.

Вы можете видеть упрощенный ответ here.

+0

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