我想通过nodejs脚本用一些伪数据填充mongodb的一个实例,并想在for循环完成时调用mongoose.disconnect(),这样程序就不会因为mongoose实例而继续循环。
问题是,因为nodejs在当前代码中是非阻塞的,所以它调用for循环,然后继续并退出。我尝试过使用async lib,但是我不知道如何才能让它工作。
在node中执行此操作的正确方式是什么?
'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发布于 2016-08-09 21:33:30
您一定认为您使用的是异步函数。所以你正在准备你的save()函数,但是他们在断开之后完成了。
您需要等待save()调用结束。两种解决方案:
使用promises模块(例如,与)
配合使用
发布于 2016-08-09 21:30:06
使用此模块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();
});
}https://stackoverflow.com/questions/38851726
复制相似问题