node.js / node_mysql – 陈旧的连接会得到“没有数据库select”的错误

我们有一个使用node_msyql的node.js应用程序,这是一个用于访问MySQL数据库的极好的小型库。

不幸的是,如果我们的连接不被使用可能需要8-10个小时,下一次我们尝试运行一个查询时,我们会从服务器得到一个"No database selected"错误。 我们需要在某处添加一个"USE db" ,但我无法弄清楚在哪里。

现在,对我来说,连接将变得陈旧是有意义的,好像node_mysql正在刷新那些陈旧的连接,但似乎没有办法确保正确的db连接。 我正在寻找一个.connected()callback或事件,或者让我确保正确的数据库总是USE'D,但没有运气到目前为止。

任何build议如何做到这一点?

是的,客户端试图重新连接。 您可以尝试使用如下代码来重新连接时查询“use db”:

 client._connection.on('connect', function() { client.query('use db'); }) 

这是在node-mysql('end'处理程序)中重新连接的地方: https : //github.com/felixge/node-mysql/blob/master/lib/mysql/client.js

 var connection = self._connection = new Stream(), parser = self._parser = new Parser(); connection .on('error', function(err) { var connectionError = err.code && err.code.match(/ECONNREFUSED|ENOTFOUND/); if (connectionError) { if (cb) { cb(err); return; } } self.emit('error', err); }) .on('data', function(b) { parser.write(b); }) .on('end', function() { if (self.ending) { self.connected = false; self.ending = false; return; } if (!self.connected) { return; } self.connected = false; self._prequeue(connect); }); connection.connect(self.port, self.host); 

由于node-mysql更新以下代码也许工作:

 client._socket.on('connect', function() { console.log("use ",DB_NAME); client.query('use '+DB_NAME); }); 

当使用node-mysql-promise软件包时 ,您可能希望使用此代码执行相同的操作:

 dbConn.pool.on('connection', function() { dbConn.pool.query("USE myDBname"); } );