【问题标题】:Node.js stops listening (gets stuck) after executing query more than 6 timesNode.js 在执行查询超过 6 次后停止侦听(卡住)
【发布时间】:2018-08-18 07:56:01
【问题描述】:

我正在使用 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 并重新加载包。

【问题讨论】:

  • $ 指的是什么?
  • 那是 jquery 兄弟

标签: node.js express reload nodemon


【解决方案1】:

您的 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");
});

或者,如果您希望帖子在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
     });
}

【讨论】:

  • 非常感谢,伙计,它确实有效,请告诉我如何在客户端检查状态,因为我不知道从哪里得到响应
  • @a.Sahel - 我在答案末尾添加了更多关于如何检查客户端状态的内容。
猜你喜欢
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多