这是我第一次尝试连接池。
我设计了一个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'
我是否错误地构建了此池模块?如果是,那么如何才能正确完成?
答案 0 :(得分:0)
这是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
将收到正确的connection
。
如果您确实需要将pool.getConnection
的返回值归因于某个var,请使用其他名称。