我正在使用mysql felix node.js模块。
我正在使用它的池连接。
我的服务器端有许多查询(在节点中编写)都是这样编写的:
this.courtsAmount = function(date, callback){
pool.getConnection(function(err, connection) {
connection.query('SELECT MAX(id) AS result from courts where date="' + date + '"', function(err, rows, fields){
connection.release();
if (err) throw err;
if (rows[0].result)
callback(rows[0].result);
else
callback(0);
});
});
};
出于某种原因,我不断地得到这个错误(从所有类似这样编写的函数):
类型错误:无法调用null的方法“releaseConnection”
它指向“connection.release()”行。
我真的不明白这里的问题是什么,正如我从pool.getConnection函数中的API了解到的,我应该可以完全访问这个连接。也许这与连接超时有关?我相信事实并非如此,因为这个错误是在我浏览我的网站时发生的。
另一个问题:
如果使用池,是否必须处理连接将超时的选项?
如果答案是肯定的,我该怎么做?
谢谢。
最佳答案
我建议在尝试使用connection
实例之前添加错误检查。我已经更新了您的代码(请内联查看我的注释):
this.courtsAmount = function(date, callback) {
pool.getConnection(function(err, connection) {
if (err) throw err; // <-- 'connection' might be null, so add an error check here
connection.query('SELECT MAX(id) AS result from courts where date="' + date + '"', function(err, rows, fields) {
if (err) throw err; // <-- moved this line up to check for an error first
connection.release(); // <-- moved this line down so error checking happens first
if (rows[0].result)
callback(rows[0].result);
else
callback(0);
});
});
};
另外,如果
date
实例来自不受信任的源,那么您的代码很容易受到SQL注入的攻击。您可以考虑切换到mysql2并使用准备好的语句。