Javascript 使用felixge design中的mysql和奇怪的行为创建Node.js

Javascript 使用felixge design中的mysql和奇怪的行为创建Node.js,javascript,mysql,node.js,Javascript,Mysql,Node.js,您好,我注意到node.js中使用felix geisendörfers可怕的mysql模块时出现了一些奇怪的行为 我的express应用程序具有以下结构 app.js(主) routesA.js routeb.js routesC.js 路由使用express的路由器功能。 每个路由文件(A-C)都必须访问mysql服务器。 但是我懒得在每个路由脚本文件中编写连接和连接选项。 因此,我制作了另一个名为DBServer.js的文件,如下所示(受stackoverflow中某人的一些提示启发)

您好,我注意到node.js中使用felix geisendörfers可怕的mysql模块时出现了一些奇怪的行为

我的express应用程序具有以下结构

  • app.js(主)
  • routesA.js
  • routeb.js
  • routesC.js
路由使用express的路由器功能。 每个路由文件(A-C)都必须访问mysql服务器。 但是我懒得在每个路由脚本文件中编写连接和连接选项。 因此,我制作了另一个名为DBServer.js的文件,如下所示(受stackoverflow中某人的一些提示启发):

在每个路由文件中,我需要通过以下方式获得此DBServer文件:

var db = require('./lib/DBServer').connect();
当我启动应用程序时,控制台会记录3次

DBServer connected successfully...
DBServer connected successfully...
DBServer connected successfully...
。。。如预期的那样

一切都很完美。我用forever运行应用程序,每次脚本失去与db服务器的连接(不时发生的情况)时,它都会重新连接。。。如预期的那样

。。。但是除了一个脚本。脚本routesA.js在处理mysql查询时停止工作。脚本将冻结,但不会退出。我必须停止并重新启动它。 在routesA、routesB或RouteESC之间调用DBServer.js没有区别。而且效果很好。。。但是,如果routesA断开连接,它似乎不会再次重新连接。。。RouteB和RouteESC仍然可以正常工作

所以我改变了脚本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中没有错误处理。。因此,forever检测到脚本退出并重新启动。。。一切都恢复正常了。 但我不想那样。我想要一个像DBServer.js中那样的正确错误处理。如前所述,这适用于脚本B和C,但不适用于脚本A

我知道这很奇怪,很难说,可能是什么问题。但也许有人也有类似的问题

这里的另一个问题是:如何处理具有多个脚本文件的数据库连接。我想知道有没有办法为应用程序中的所有脚本文件共享一个mysql连接

问候
martin

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


我还应该注意到,如果您使用的是
mysql2
模块(与
mysql
兼容,但速度要快得多),那么有一种
connection.ping()
方法可以用来定期ping服务器,以帮助保持连接的活动状态。

我也这么认为。但如前所述,当5个脚本中的4个失去连接时,重新连接工作得非常好。只是在第五节的时候不起作用。。。我还是没有落后。
var mysql      = require('mysql');
var db = mysql.createConnection({
  host: '127.0.0.1', 
  user: 'my username', 
  password: '******', 
  database: 'ma database'
});

db.connect();