【问题标题】:Open DB connection only once for all requests对所有请求只打开一次数据库连接
【发布时间】:2016-05-25 16:29:26
【问题描述】:

在下面的代码中,我试图在“/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);

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    假设您使用的是 Express 4,只是建议我使用 Router 对象而不是 app。但无论如何,如果您为您的数据库创建一个模块,它将在其中保存实例,只需从我的 github 存储库here 中提取一个示例。

    如果您仔细查看它,您会注意到,如果您将数据库设为模块,则有一个初始化函数,该函数在创建应用程序时调用,它为它提供了遵循微服务架构所需的抽象架构以及为您提供单个连接调用,因此您不会经常关闭/打开。

    下面是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 函数和exports.db。所有模块都与同一个模块共享一个实例,这就是 db 引用有效的原因。

    没有理由继续传递实例,它只是在重构或寻找错误时带来层来密切关注。在合理范围内尽可能多地抽象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      相关资源
      最近更新 更多