为什么尝试发布此Node-MySQL池会导致错误?

时间:2015-02-23 16:44:31

标签: javascript mysql node.js

这是我第一次尝试连接池。

我设计了一个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'

我是否错误地构建了此池模块?如果是,那么如何才能正确完成?

1 个答案:

答案 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,请使用其他名称。