带有来自felixge设计的mysql的Node.js和奇怪的行为

时间:2014-08-03 17:36:30

标签: javascript mysql node.js

您好我注意到node.js中有一些奇怪的行为,其中包含felixgeisendörfers真棒mysql模块。

我的快递应用程序中有以下结构。

  • app.js(main)
  • routesA.js
  • routesB.js
  • routesC.js

路由使用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连接吗?

亲切的问候 马丁

1 个答案:

答案 0 :(得分:1)

原因可能与您在require()上返回初始连接对象的事实有关,但如果断开连接,则重新分配外部脚本的连接变量没有引用(它们仍然只引用旧/原始连接对象)。

我还应该注意,如果您使用的是mysql2模块(与mysql兼容,速度更快),则可以使用connection.ping()方法定期ping该方法服务器,以帮助保持连接活跃。