最好是打开新连接还是重复使用?使用模块时,因为我习惯将我的代码分成几个文件。
a.js
module.exports = function (req, res) {
new mongodb.... (err, db) { // open a connection
b(function (err, result) {
db.close(); // close the connection
res.send(result);
});
});
};
b.js
// re-open a connection ? or take the connection of "a.js" ? (passing "db")
异步时,必须小心继续使用相同的连接(套接字)。这可确保在写入完成之后,下一个操作不会开始。
谢谢!
答案 0 :(得分:5)
当您require('somemodule')
然后再次需要它时,它将使用ALREADY加载的实例。这可以让你轻松创建单身。
所以 - 在sharedmongo.js
内部:
var mongo = require('mongodb');
// this variable will be used to hold the singleton connection
var mongoCollection = null;
var getMongoConnection = function(readyCallback) {
if (mongoCollection) {
readyCallback(null, mongoCollection);
return;
}
// get the connection
var server = new mongo.Server('127.0.0.1', 27017, {
auto_reconnect: true
});
// get a handle on the database
var db = new mongo.Db('squares', server);
db.open(function(error, databaseConnection) {
databaseConnection.createCollection('testCollection', function(error, collection) {
if (!error) {
mongoCollection = collection;
}
// now we have a connection
if (readyCallback) readyCallback(error, mongoCollection);
});
});
};
module.exports = getMongoConnection;
然后在a.js
内:
var getMongoConnection = require('./sharedmongo.js');
var b = require('./b.js');
module.exports = function (req, res) {
getMongoConnection(function(error, connection){
// you can use the Mongo connection inside of a here
// pass control to b - you don't need to pass the mongo
b(req, res);
})
}
在b.js
内:
var getMongoConnection = require('./sharedmongo.js');
module.exports = function (req, res) {
getMongoConnection(function(error, connection){
// do something else here
})
}
这个想法是a.js
和b.js
同时调用getMongoCollection
,第一次连接,第二次返回已经连接的那个。这样它可以确保您使用相同的连接(套接字)。