首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nodejs中的mongoose disconnect on for loop end

nodejs中的mongoose disconnect on for loop end
EN

Stack Overflow用户
提问于 2016-08-09 21:10:17
回答 2查看 434关注 0票数 0

我想通过nodejs脚本用一些伪数据填充mongodb的一个实例,并想在for循环完成时调用mongoose.disconnect(),这样程序就不会因为mongoose实例而继续循环。

问题是,因为nodejs在当前代码中是非阻塞的,所以它调用for循环,然后继续并退出。我尝试过使用async lib,但是我不知道如何才能让它工作。

在node中执行此操作的正确方式是什么?

代码语言:javascript
复制
'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();

输出:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2016-08-09 21:33:30

您一定认为您使用的是异步函数。所以你正在准备你的save()函数,但是他们在断开之后完成了

您需要等待save()调用结束。两种解决方案:

使用promises模块(例如,与)

  • use

配合使用

票数 0
EN

Stack Overflow用户

发布于 2016-08-09 21:30:06

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

然后执行以下代码。

代码语言:javascript
复制
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();
   });
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38851726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档