您好我注意到node.js中有一些奇怪的行为,其中包含felixgeisendörfers真棒mysql模块。
我的快递应用程序中有以下结构。
路由使用express的Router功能。 每个路由文件(A-C)都必须访问mysql服务器。 但我懒得在每个路由脚本文件中编写连接和连接选项。 所以我创建了另一个名为DBServer.js的文件。它如下所示(灵感来自stackoverflow中某人的一些提示):
var mysql = require('mysql');
exports.connect = function (){
var db_config = {
host: '127.0.0.1',
user: 'my username',
password: '********',
database: 'my database'
};
var connection;
function autoConnect() {
connection = mysql.createConnection(db_config);
connection.connect(function(err) {
if(err) {
console.log('DBServer Error: cannot connect to db. Reconnect attempt in 2 seconds...\nError: ', err);
setTimeout(autoConnect, 2000);
}
else{
console.log('DBServer connected successfully...');
}
});
connection.on('error', function(err) {
if(err.code === 'PROTOCOL_CONNECTION_LOST') {
console.log('DBServer Error: lost connection. Reconnect attempt in 2 seconds...\nError: ', err);
autoConnect();
}
else {
console.log('DBServer Error: minor error\nError: ', err);
}
});
}
autoConnect();
return connection
}
在每个路由文件中,我都需要这个DBServer文件:
var db = require('./lib/DBServer').connect();
当我启动应用程序时,控制台会记录3次
DBServer connected successfully...
DBServer connected successfully...
DBServer connected successfully...
......按照预期。
一切都很完美。我永远运行应用程序,每次脚本丢失与db-server的连接(不时会发生什么),它会再次重新连接...按预期。
......但是!除了一个脚本。当涉及到mysql查询时,脚本routesA.js停止工作。该脚本冻结但不退出。我必须停下来重新启动它。 在routesA,routesB或routesC之间调用DBServer.js没有区别。并且它工作得很好......但似乎如果routesA失去连接,它不会再次重新连接...... routesB和routesC仍然可以正常工作。
所以我改变了脚本routesA.js连接数据库的方式。我现在连接脚本routesA.js而不是通过DBServer.js,但需要手动方式
var mysql = require('mysql');
var db = mysql.createConnection({
host: '127.0.0.1',
user: 'my username',
password: '******',
database: 'ma database'
});
db.connect();
现在它可以工作......并且运行数天没有问题。但其原因是,因为现在我没有脚本routesA.js中的错误处理..所以永远检测脚本退出并重新启动...一切都有效。 但我不希望这样。我想在DBServer.js中进行适当的错误处理。如上所述这适用于脚本B和C,但不适用于脚本A ......
我知道这很奇怪也很难说,可能是什么问题。但也许某人有类似的问题。
这里的另一个问题是:如何使用多个脚本文件处理数据库连接。我有办法为应用程序中的所有脚本文件共享一个mysql连接吗?
亲切的问候 马丁答案 0 :(得分:1)
原因可能与您在require()
上返回初始连接对象的事实有关,但如果断开连接,则重新分配外部脚本的连接变量没有引用(它们仍然只引用旧/原始连接对象)。
我还应该注意,如果您使用的是mysql2
模块(与mysql
兼容,速度更快),则可以使用connection.ping()
方法定期ping该方法服务器,以帮助保持连接活跃。