2016-08-09 26 views
0

我想通過nodejs腳本填充一些僞造數據的mongodb實例,並且我想在for循環完成時調用mongoose.disconnect()以便程序不會由於貓鼬的情況,繼續循環。mongoose斷開for循環在nodejs中結束

問題是,因爲nodejs在當前代碼中是非阻塞的,所以它調用for循環,然後繼續並退出。 我已經嘗試了一些與異步庫,但不能弄清楚我是如何使這項工作。

在節點中這樣做的正確方法是什麼?

'use strict'; 
var mongoose = require('mongoose'), 
    promise = require('promise'); 

mongoose.Promise = promise; 
    var uri = 'mongodb://localhost:27017/test' 

var test1Schema = new mongoose.Schema({ 
    name: String, 
    type: String 
}); 

var test2Schema = new mongoose.Schema({ 
    name: String, 
    type: String 
}); 

var test3Schema = new mongoose.Schema({ 
    name: String, 
    type: String 
}); 

var test1 = mongoose.model('test1', test1Schema); 
var test2 = mongoose.model('test2', test2Schema); 
var test3 = mongoose.model('test3', test3Schema); 

function genRandom (high, low) { 
    return Math.floor(Math.random() * (high - low) + low); 
} 

mongoose.connect(uri); 

var _connection = mongoose.connection; 

_connection.on('error', function (err) { 
    console.log('Couldn\'t connect to the database %s - %s', uri, err); 
}); 

_connection.on('open', function() { 
    console.log('Connection open - ', uri); 
}); 

_connection.on('close', function() { 
    console.log('Closed mongoose connection'); 
}); 

var saveCallback = function (err) { 
    if (err) { 
    console.log('An error occured while saving %s', err); 
    } 
} 

function genRecords (callback) { 
    for (var i=0; i <= 5; i++) { 
    new test1({ 
     name: 'test_' + i.toString(), 
     type: genRandom(123, 321).toString() 
    }).save(callback); 

    new test2({ 
     name: 'test_' + i.toString(), 
     type: genRandom(456, 654).toString()   
    }).save(callback); 

    new test3({ 
     name: 'test_' + i.toString(), 
     type: genRandom(789, 987).toString()   
    }).save(callback); 
    } 
} 

genRecords(saveCallback) 

mongoose.disconnect(); 

輸出:

Connection open - mongodb://localhost:27017/test 
Closed mongoose connection 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 
An error occured while saving MongoError: server localhost:27017 sockets closed 

回答

-1

使用此模塊http://caolan.github.io/async/

然後做這個代碼。

async.times(5, function(i, done){ 
    //run in here your 3 instances with async.waterfall or something like this then go to next iteration 
    methodToSave3Instances(i, done); 
}, function(err) { 
    mongoose.disconnect(); 
}); 

function methodToSave3Instances(i , cb) { 
    async.waterfall([ 
    function(callback) { 
     new test1({ 
      name: 'test_' + i.toString(), 
      type: genRandom(123, 321).toString() 
     }).save(callback); 
    }, 
    function(callback) { 
     new test2({ 
      name: 'test_' + i.toString(), 
      type: genRandom(123, 321).toString() 
     }).save(callback); 
    }, 
    function(callback) { 
     new test3({ 
      name: 'test_' + i.toString(), 
      type: genRandom(123, 321).toString() 
     }).save(callback); 
    } 
    ], function (err, result) { 
     cb(); 
    }); 
} 
0

你一定會認爲你異步功能工作。所以你正在準備你的save()功能,但是他們在斷線後完成

您需要等待save()呼叫的結束。有兩種解決方案: