Node.js 执行查询超过 6 次后停止监听(卡住)
Node.js stops listening (gets stuck) after executing query more than 6 times
我正在使用 expressJs,这是我多次执行的查询
router.post('/Index_api/Reminder/Delete',function(req, res)
{
Reminder_Id = req.body;
DeleteRow('Reminders','Reminder_Id',Reminder_Id.Reminder_Id);
});
int 这是 DeleteRow 函数
function DeleteRow(TableName,WCC, id)
{
var query ="Delete FROM `"+TableName + "` WHERE `"+ WCC +"` =" + id;
conn.query(query,function(err,result)
{
if(err)
{
console.error(err);
return;
}else{
console.log(result);
}
});
}
我像这样将数据发布到这条路线:
function DeleteRow(id)
{
$.post('/Index_api/Reminder/Delete',{
Reminder_Id:id
});
$("#row"+id).remove();
}
如果我想一起删除 6 条记录没有问题,但是到第 7 条没有执行并卡住了。
我也在使用 nodemon 和重新加载包。
您的 router.post()
路由处理程序未返回任何响应。因此,浏览器仍在等待某种响应。浏览器对任何给定主机都有最大连接数,因此一旦有太多连接都坐在那里等待响应,浏览器就会对下一个请求进行排队,直到前一个请求完成。
这些请求最终会超时,但这可能需要很长时间。
要修复,只需从您的路由处理程序发送响应:
router.post('/Index_api/Reminder/Delete',function(req, res) {
Reminder_Id = req.body;
DeleteRow('Reminders','Reminder_Id',Reminder_Id.Reminder_Id);
res.send("ok");
});
或者,如果您希望 post 在 DeleteRow()
完成后实际响应,您可以让 DeleteRow()
通过将 res
传递给它来发送正确的响应,并且让它发送响应。
router.post('/Index_api/Reminder/Delete',function(req, res) {
Reminder_Id = req.body;
DeleteRow('Reminders','Reminder_Id',Reminder_Id.Reminder_Id, res);
});
function DeleteRow(TableName, WCC, id, res) {
var query = "Delete FROM `" + TableName + "` WHERE `" + WCC + "` =" + id;
conn.query(query, function(err, result) {
if (err) {
console.error(err);
res.status(500).send("delete failed");
} else {
res.send("delete OK");
}
});
}
然后,您可能还应该更改您的客户端代码以实际查看返回的状态并采取相应的行动。
function DeleteRow(id) {
$.post('/Index_api/Reminder/Delete',{
Reminder_Id:id
}).then(function(result) {
if (result.status == 200) {
// successful
$("#row"+id).remove();
} else {
// handle server error here
}
}, function(err) {
// network error here
});
}
我正在使用 expressJs,这是我多次执行的查询
router.post('/Index_api/Reminder/Delete',function(req, res)
{
Reminder_Id = req.body;
DeleteRow('Reminders','Reminder_Id',Reminder_Id.Reminder_Id);
});
int 这是 DeleteRow 函数
function DeleteRow(TableName,WCC, id)
{
var query ="Delete FROM `"+TableName + "` WHERE `"+ WCC +"` =" + id;
conn.query(query,function(err,result)
{
if(err)
{
console.error(err);
return;
}else{
console.log(result);
}
});
}
我像这样将数据发布到这条路线:
function DeleteRow(id)
{
$.post('/Index_api/Reminder/Delete',{
Reminder_Id:id
});
$("#row"+id).remove();
}
如果我想一起删除 6 条记录没有问题,但是到第 7 条没有执行并卡住了。 我也在使用 nodemon 和重新加载包。
您的 router.post()
路由处理程序未返回任何响应。因此,浏览器仍在等待某种响应。浏览器对任何给定主机都有最大连接数,因此一旦有太多连接都坐在那里等待响应,浏览器就会对下一个请求进行排队,直到前一个请求完成。
这些请求最终会超时,但这可能需要很长时间。
要修复,只需从您的路由处理程序发送响应:
router.post('/Index_api/Reminder/Delete',function(req, res) {
Reminder_Id = req.body;
DeleteRow('Reminders','Reminder_Id',Reminder_Id.Reminder_Id);
res.send("ok");
});
或者,如果您希望 post 在 DeleteRow()
完成后实际响应,您可以让 DeleteRow()
通过将 res
传递给它来发送正确的响应,并且让它发送响应。
router.post('/Index_api/Reminder/Delete',function(req, res) {
Reminder_Id = req.body;
DeleteRow('Reminders','Reminder_Id',Reminder_Id.Reminder_Id, res);
});
function DeleteRow(TableName, WCC, id, res) {
var query = "Delete FROM `" + TableName + "` WHERE `" + WCC + "` =" + id;
conn.query(query, function(err, result) {
if (err) {
console.error(err);
res.status(500).send("delete failed");
} else {
res.send("delete OK");
}
});
}
然后,您可能还应该更改您的客户端代码以实际查看返回的状态并采取相应的行动。
function DeleteRow(id) {
$.post('/Index_api/Reminder/Delete',{
Reminder_Id:id
}).then(function(result) {
if (result.status == 200) {
// successful
$("#row"+id).remove();
} else {
// handle server error here
}
}, function(err) {
// network error here
});
}