Promise-MySQL无法将连接释放回池中

我对Node.js开发非常陌生,我正在开发一个应用程序,需要我从mysql数据库中提取用户。 我正在使用promise-mysql库来查询一个mysql数据库。 我正在尝试使用这样的连接池:

 var pool = mysql.createPool({ host: hgh.host, user: hgh.user, password: hgh.pw, database: hgh.name, connectionLimit: 10 }); 

作为我的模块中的全局variables。

然后我有上面的函数从池中返回一个连接。

 function connect() { return pool.getConnection().then(function(connection) { return connection }).catch(function(error) { console.log("Connect failed"); throw ErrorModel.generateErrorObject(error, 500); }); } 

下面是我用来查询数据库的function:

 function getUser(username) { var sql_query = `SELECT * FROM userstable WHERE userName = ` + `'` + username + `'`; return connect().then(function(conn) { return conn.query(sql_query).then(function(rows) { console.log("HGH getUser Then"); console.log(pool); conn.release(); return rows; }); }).catch(function(error) { console.log("HGH getUser Catch"); console.log(error); throw ErrorModel.generateErrorObject(error, 500); }); } 

我得到这个问题:

conn.release在试图释放当前连接到池中时不是一个函数。 我的逻辑错了吗? 我的目标是build立一个连接池(达到一定的数目),如果用户需要查询, getConnection()函数就会从池中获取一个空闲的连接,或者创build一个连接。 问题是我不能为我的生活释放它回到游泳池作为free ..每次我用conn.end()而不是release连接的请求时,连接仍保留在池的_allConnectionsarrays时,我安慰它,在_freeConnections数组中绝对没有连接。

任何人都知道我可以再次连接自由吗?

看看模块的代码,我发现从池释放连接的function:

 pool.prototype.releaseConnection = function releaseConnection(connection) { //Use the underlying connection from the mysql-module here: return this.pool.releaseConnection(connection.connection); }; 

因此,如果所有这些函数都存在于同一个文件中,则可以在getUser函数中执行以下操作:replace

 conn.release(); 

 pool.releaseConnection(conn); 

看看这个代码, promise-mysql包装了原始的连接对象,它不公开release方法。 然而,原始的作为一个属性被称为connection ,所以这个工作:

 conn.connection.release(); 

一些随意的想法:

  • 你可能应该逃避你的查询input:

     var sql_query = `SELECT * FROM userstable WHERE userName = ${ pool.escape(username) }`; 
  • 您的代码在发生错误时不会释放连接(因为.then()callback中的代码不会被调用); 最好使用.finally()来执行释放,因为这将被解决被拒绝的情况:

     function connect() { var conn = null; return pool.getConnection().then(function(connection) { conn = connection; return connection; }).catch(function(error) { console.log("Connect failed", error); }).finally(function() { if (conn) { conn.connection.release(); } }); }