2013-05-17 133 views
7

看来我不能使用Node.js本地驱动程序关闭MongoDB连接。当我运行node replica.js时,脚本永远不会结束,因此连接因某些原因无法关闭。无法关闭与Node.js的MongoDB连接?

这是代码。这是一个副本集,但我不认为这是一个问题:

var mongodb = require('mongodb') 
    , Db  = mongodb.Db 
    , Server = mongodb.Server 
    , ReplSet = mongodb.ReplSet; 

// Replica set 
var replSet = new ReplSet([ 
    new Server('localhost', 27017), // Primary 
    new Server('localhost', 27018), // Secondary 
    new Server('localhost', 27016), // Secondary 
    ], 
    { rs_name: 'replica', read_secondary: true } 
); 

var db = new Db('test', replSet, { native_parser: true, w: 1 }); 

// Opening 
db.open(function (err, db) { 
    if (err) console.error(err); 

    db.close(); 
}); 

连接到一个单一的mongod实例工作得很好,连接得到闭合,脚本结束,没有process.exit()需要(通过robertklep建议)拨打:

var mongodb = require('mongodb') 
    , Db  = mongodb.Db 
    , Server = mongodb.Server; 

// Single instance 
var server = new Server('localhost', 27017): 
var db = new Db('test', server, { native_parser: true, w: 1 }); 

// Opening 
db.open(function (err, db) { 
    if (err) console.error(err); 

    db.close(); 
}); 

回答

5

事实证明,这是一个错误,现在固定在1.3.6。前几天看this issue I opened。有趣的是,这是我第一次使用MongoDB ...

0

您可能需要强制连接池通过传递true作为第一个参数来close在这种情况下关闭。试图关闭时,也应该提供一个回调,这样你可以提醒任何问题:

db.open(function (err, db) { 
    if (err) console.error(err); 

    db.close(true, function (err) { 
     if (err) console.error(err); 
     else console.log("close complete"); 
    }); 
}); 
+0

为什么我的第二个示例没有强制工作,但我需要强制关闭与副本集的连接? – gremo

+0

@格雷莫你不应该需要,但意想不到的事情正在发生。回调被调用时是否没有错误? – JohnnyHK

+0

完全没有错误。即使使用'close(true)'也没有帮助。你的代码打印出“close complete”,并且它永远不会退出脚本。我需要用'CTRL + C'强制关闭。 – gremo