【问题标题】:AJAX Request Not Completing After Adding Express Middleware添加 Express 中间件后 AJAX 请求未完成
【发布时间】:2017-09-04 00:20:18
【问题描述】:

我有一段代码通过 Jquery 发送 DELETE 请求,如下所示:

$(document).ready(function(){
$('.formula-block').on('click', function(e){
if (e.target.className == 'button-warning pure-button') {
  $.ajax({
    url: '/formula-list/' + this.id,
    type: 'DELETE',
    success: reload
  });
 }
});

function reload () {
  window.location.reload(true);
  }
});

在我更新我的应用程序中的一个中间件之前,这一直很好。

我在app.js 文件中使用以下 sn-p 使 MongoDB 可用于我的程序:

app.use((req, res, next) => {
  mongo.connect('mongodb://localhost:27017/formulas', (e, db) => {
    if (e) return next(e);
    req.db = db;
    next();
 });
});

但是,我最近在最后一对括号之前添加了以下代码行

req.on('end', () => { req.db.close(); });

现在我的AJAX 请求中的SUCCESS 部分不再有效。

我认为这是因为 AJAX 请求正在等待响应而没有得到响应,因为最后一行正在剪裁它,所以永远不会调用 success

我的主要问题是我希望页面在某些内容被删除后刷新更新的项目列表。我不知道这是怎么发生的,但现在我的安排不再奏效了。

如果有帮助,这里是接收到DELETE 请求的服务器端代码:

router.delete('/formula-list/:id', function(req, res){
  var db = req.db.collection('users');
  var f_id = new ObjectID(req.params.id);
  db.updateOne({"_id": new ObjectID(req.user.id)}, { $pull: {
    "formulas": {"f_id": f_id}
  }}, function(err, r){
      if(err) {throw err;}
      assert.equal(null, err);
    });
});

【问题讨论】:

  • 查看 Chrome 调试器的网络选项卡,看看您是否从您的 ajax 调用中得到任何响应,如果是,那么该响应是什么。您首先需要知道返回给客户端的内容是什么,或者问题是否在于没有发送响应。
  • 你在打电话给res.send吗?顺便说一句,在尝试关闭连接或在连接回调中侦听 req end 事件之前,您应该检查您的 req 中是否定义了 db。
  • 我看不到您实际发送请求响应的任何地方。在您在服务器上执行res.send(...) 之前,浏览器不会知道请求已完成。因此,当您的数据库操作完成后,您应该 res.send() 向客户端返回一些内容,以便客户端知道请求已完成。

标签: javascript jquery node.js mongodb express


【解决方案1】:

我不知道如何解决您的问题,但也许您可以通过在 AJAX 调用中添加 error 处理程序来获得一些见解:

$.ajax({
    url: '/formula-list/' + this.id,
    type: 'DELETE',
    success: reload,
    error: function() {
        console.log(arguments);
    }
  });

如果 AJAX 成功处理程序以前有效,但现在不再有效,则很可能发生了错误。希望这会有所帮助!

【讨论】:

  • 谢谢你的提示,但是当我运行它时没有出现错误。
  • 尝试一些调试。 1. 确保 AJAX 调用已发送。 2.在后端添加打印语句希望你能解决!
  • 请求命中。如果我手动刷新页面,一切都会更新。就像我说的那样,在我添加 req.on('close').... 措辞之前它工作得很好,这让我在这里遇到了麻烦。
  • 那么听起来您的 Express.js 脚本中的某些内容正在阻塞。请求永远不会发送回前端。也许 Express 文档可以在这里提供帮助?
【解决方案2】:

尝试执行complete: function(){reload} 之类的操作,这样 ajax 将在完成删除功能后重新加载。

(旁注:我之前遇到过这种类型的问题,它只适用于某些浏览器,因为其他浏览器不支持delete 方法)

希望对你有帮助!

【讨论】:

    【解决方案3】:

    根据我的问题的 cmets,问题是我没有明确地根据我的请求创建任何类型的响应,这就是问题所在。

    我所要做的就是将 res.end() 添加到我的 express sn-p 中,问题就解决了。

    这成功了:

    router.delete('/formula-list/:id', function(req, res){
      var db = req.db.collection('users');
      var f_id = new ObjectID(req.params.id);
      db.updateOne({"_id": new ObjectID(req.user.id)}, { $pull: {
        "formulas": {"f_id": f_id}
      }}, function(err, r){
                 assert.equal(null, err);
                 assert.equal(1, r.modifiedCount);
               });
      res.end();
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-06
      相关资源
      最近更新 更多