添加快速中间件后,AJAX请求未完成

时间:2017-09-03 03:19:57

标签: javascript jquery node.js mongodb express

我有一段代码,通过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文件中为我的程序提供了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(); });

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

我认为这是因为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);
    });
});

3 个答案:

答案 0 :(得分:1)

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

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

如果AJAX成功处理程序以前工作过,而不再存在,则很可能发生错误。希望这有帮助!

答案 1 :(得分:0)

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

(旁注:之前我遇到过这类问题而且只能在某些浏览器上运行,因为其他浏览器不支持delete方法)

希望它有所帮助!

答案 2 :(得分:0)

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

我所要做的只是将res.end()添加到我的快递片段中,问题就解决了。

这就是诀窍:

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();
});