这是我第一次尝试连接池。
我设计了一个 Node.js 数据库连接模块来创建单个连接,该连接在稍后传递给各个模块时使用的池函数中引用。
/* Database Connection */
//REQUIRE CUSTOM MODULES
var mysql = require('mysql');
//DEFINE HELPER FUNCTIONS
function createPool() {
var pool = mysql.createPool({
dateStrings : true,
host : '****',
user : '****',
password : '****',
database : '****'
});
return pool;
}
function queryFunc(connection, query, callback) {
connection.query(query, function(err, rows) {
if (err) {
throw err;
} else {
connection.release();
callback(rows);
}
});
}
//CREATE POOL
var pool = createPool();
//DEFINE MODULE EXPORTS
var connection = {};
connection.connect = function(query, callback) {
if ( typeof query !== 'undefined') {
debug.log('Performing Query: ' + query);
//get connection via pool
var connection = pool.getConnection(function(err, connection) {
debug.log("New connection pool pulled");
if (err) {
throw err;
} else {
//otherwise run all queries
var qComplete = 0;
queryFunc(connection, query, callback);
}
});
} else {
debug.log('Oops! Tried to perform an empty query...');
}
};
module.exports.connection = connection;
用法:
var connection = require('connection.js').connection;
connection.connect(...);
它尝试运行查询(我知道,因为我必须修复它提示的错误查询),但给了我错误:
TypeError: Object # has no method 'release'
我构建这个池模块是否错误?如果是这样,如何正确完成?
最佳答案
这是 Javascript variable scope 。当您声明时:
var connection = pool.getConnection(function(err, connection) {...
在connect
函数中,这个conection
变量将使用pool.getConnection
的返回值进行初始化。问题是您将 connection
传递给同一范围内的另一个函数:
queryFunc(connection, query, callback);
根据您的解释,您的模块没问题,并且您不需要 connection
的内部声明,因此您可以将其撕掉:
pool.getConnection(function(err, connection) {...
,现在 queryFunc
将收到正确的连接
。
如果您确实需要将pool.getConnection
的返回值归因于某个var,只需使用另一个名称即可。
关于javascript - 为什么尝试释放此 Node-MySQL 池会导致错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28678764/