问题
我的问题是即使我已经使用请求释放了一个返回池的连接。 。
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文件。
谢谢
这是我的第一个问题,如果我错过了任何有用的内容,请告诉我。
感谢您的支持。
答案 0 :(得分:1)
这是有道理的,因为mysql
模块没有主动检查(和删除)在mysql
模块之外添加的事件处理程序。所以你需要做的是在释放连接之前删除你的处理程序。例如:
connection.removeListener('error', onConnError);
connection.release();
// ...
function onConnError(err) {
console.log("Error with connection:" + connection.threadId);
}
connection.on('error', onConnError);