我正在使用express 4.x和节点的最新MySQL包。
PHP应用程序(我最熟悉的)的模式是包含某种数据库连接公共文件,并在脚本完成后自动关闭连接。在Express应用程序中实现它时,它可能看起来像这样:
// includes and such
// ...
var db = require('./lib/db');
app.use(db({
host: 'localhost',
user: 'root',
pass: '',
dbname: 'testdb'
}));
app.get('/', function (req, res) {
req.db.query('SELECT * FROM users', function (err, users) {
res.render('home', {
users: users
});
});
});
请原谅缺乏错误处理,这是一个原始的例子。在任何情况下,我的db()
函数都会返回将连接到数据库并存储连接对象req.db
的中间件,从而有效地为每个请求提供一个新对象。这种方法存在一些问题:
我看到的下一个模式是在应用启动时简单地打开一个连接。
var mysql = require('mysql');
var connection = mysql.createConnection(config);
connection.on('connect', function () {
// start app.js here
});
问题:
我的问题是,在快递应用程序中处理数据库连接应该采取什么样的方法?它需要扩展(不是无限的,只是在合理范围内),我不应该在路由中手动关闭/包含每个路径的额外中间件,并且我(最好)不想捕获超时错误并重新打开它们。
答案 0 :(得分:1)
既然你在NodeJS中谈论MySQL,我必须指向你KnexJS!你会发现写作查询更有趣。他们使用的另一件事是连接池,它可以解决您的问题。它正在使用一个名为generic-pool-redux
的小包来管理数据库连接等事情。
我们的想法是,您的快递应用程序通过代码访问数据库。事实证明,该代码使用连接池来共享连接之间的负载。我初始化我的东西:
var Knex = require('knex');
Knex.knex = Knex({...}); //set options for DB
在其他档案中
var knex = require('knex').knex;
现在所有可以访问数据库的文件都使用相同的连接池(在开始时设置一次)。
我确定Node和MySQL还有其他连接池包,但如果您正在进行任何动态或复杂的SQL查询,我个人推荐使用KnexJS。祝你好运!