在已释放回池中的连接上触发节点mysql错误事件

时间:2016-07-31 19:51:29

标签: mysql node.js

问题

我的问题是即使我已经使用请求释放了一个返回池的连接。 。

connection.release();

。 。 。我仍然得到以下代码在60秒后触发并记录错误(我假定预先定义的超时)。

connection.on('error', function(err) {
            console.log("Error with connection:" + connection.threadId);
            return;
});

我很确定连接正在发布,因为如果我删除发布行并继续发送请求,我可以看到池中使用的不同连接。如果我保留它们,似乎会使用相同的连接。

路线代码

app.post('/addImageData', function (req, res) {
    pool.getConnection(function(err,connection){
        if (err) {
            connection.release();
            res.json({"code" : 100, "status" : "Error in connection database"});
            return;
        }

        writeToDatabaseLog("Image post request made with ID:" + connection.threadId, connection);

        uploadImageToCloudinary(req.body.image, connection)
            .then(function(rawData) {
                return addImageDataToDB(rawData, connection)
            }).then(function(imageURL) {
                return notifyIFTTTofImageCapture(imageURL, connection)
            }).then(function(){
                connection.release();
                res.send(200);
            }, function(){
                connection.release();
                res.send(500);
            });

        connection.on('error', function(err) {
            console.log("Error with connection:" + connection.threadId);
            return;
        });
    });

});

我的Bodge Fix

我已尝试在“池连接”和“错误处理”上阅读API reference

我发现如果我切换三个例子。 。

connection.release()

。 。 。至 。 。

connection.destroy()

。 。 。然后问题就不再发生了。

我认为这不是最佳解决方案,因为它会从池中删除连接。 API表示将创建一个新连接,但感觉这会从池中消失。

我认为我没有得到

问题似乎是,即使连接已返回到池,错误的事件侦听器仍处于活动状态。但是我不知道如何解决这个问题。

完整代码:

这是我的完整代码,但确实包含上述​​的bodge修复程序。 https://github.com/tbenyon/suphomie/blob/de855c898065a50c119f66b3773a17012e3c3b8e/app.js

测试

如果您想克隆存储库并进行现场测试,则会在此提交中生成一个名为“testDoorBellClient.py”的测试python文件。

谢谢

这是我的第一个问题,如果我错过了任何有用的内容,请告诉我。

感谢您的支持。

1 个答案:

答案 0 :(得分:1)

这是有道理的,因为mysql模块没有主动检查(和删除)在mysql模块之外添加的事件处理程序。所以你需要做的是在释放连接之前删除你的处理程序。例如:

connection.removeListener('error', onConnError);
connection.release();

// ...

function onConnError(err) {
  console.log("Error with connection:" + connection.threadId);
}
connection.on('error', onConnError);
相关问题