2

我正在使用 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);
        });
  });
    };

出于某种原因,我不断收到此错误(来自各种像这样编写的函数):类型错误:无法调用指向'connection.release()'行的null方法'releaseConnection'。我真的不明白这里有什么问题,正如我从 pool.getConnection 函数内部的 API 中理解的那样,我应该可以完全访问连接。也许这是与连接超时有关的问题?我相信事实并非如此,因为这个错误发生在我实际浏览我的网站时。

另一个问题:如果我使用池,我是否必须处理连接将超时的选项?如果答案是肯定的,我该怎么做?

谢谢。

4

1 回答 1

1

我建议在尝试使用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并使用准备好的语句。

于 2015-01-02T19:00:18.300 回答