对于所有请求,只打开一次DB连接



在下面的代码中,我试图在"/post"请求之前打开DB连接。我可以使用全局连接解决以下问题,但有其他方法可以通过将数据库连接绑定到当前请求来解决吗。

//Model.js
function DB(){
this.DBConn (req, res, next) {
var conn = <db connection string>;
pg.connect(conn, function (err, client) {
req.db = client;
})
this.create (req, res, next) {
// Using req.db.query(), to execute INSERT query
}
}
}
//server.js
var DB = require('./model.js');
var app = express.Router();
// Open DB connection
new DB.DBConn(); //How to pass request in this function
app.post('/post', DB.create);

假设您使用的是Express 4,这只是一个建议,我会使用Router对象而不是应用程序。但不管怎样,如果你为你的数据库制作了一个模块,它会在里面保存实例,只需从我的github repo中提取一个样本。

如果你仔细查看它,你会注意到,如果你把数据库作为一个模块,然后有一个初始化函数,当你的应用程序被创建时,它会被调用,它为它提供了遵循微服务架构模式所需的抽象,同时为你提供了一个连接调用,这样你就不会经常关闭/打开。

下面是database.js文件

var mongodb = require('mongodb');
var uri = 'some database connection string for mongodb ';
function initilizeDb(cb) {
mongodb.connect(uri, function(err, db) {
if (err) {
cb(err);
return;
}
exports.db = db; //this is the part you need to do in sql connection or w.e after you get the async connection handler.
cb(null);
});
};
exports.initDb = initilizeDb;

正如您所看到的,我们导出initialDb函数和initialized函数内部的exports.db。所有模块都与同一个模块共享一个实例,这就是db引用有效的原因。

没有理由不停地传递实例,它只是在重构或查找bug时带来了层来关注。在合理的范围内尽可能地抽象。

最新更新