2017-09-03 51 views
-1

后我的代码片段通过jQuery发送DELETE请求,看起来像这样:AJAX请求没有完成添加快捷中间件

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

这工作得很好,直到我在我的应用程序更新的一个中间件的。

我用下面的代码片断做出的MongoDB提供给我的计划,我app.js文件:

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); 
    }); 
}); 
+0

看在Chrome调试器的网络选项卡,看看你是否得到任何回应从您的AJAX调用回,如果是这样,这种反应是什么。你首先需要知道什么是回到客户端,或者问题是没有响应发送。 – jfriend00

+0

你在调用'res.send'吗?顺便说一句,在尝试关闭连接或侦听连接回调中的req end事件之前,您应该检查db是否在req中定义。 –

+0

我没有看到任何地方你实际发送的请求响应。直到你在服务器上执行'res.send(...)',浏览器才会知道请求已经完成。所以,当你的数据库操作完成时,你应该'res.send()'回到客户端,以便知道请求已完成。 – jfriend00

回答

1

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

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

如果AJAX成功处理程序之前工作过,现在不再了,这可能是一个错误正在发生。希望这可以帮助!

+0

谢谢你的提示,但是当我运行这个时,没有错误出现。 –

+0

尝试一些调试。 1.确保发送了AJAX呼叫。 2.在后台添加打印语句 希望你弄明白! –

+0

请求正在击中。如果我手动刷新页面,一切都会更新。就像我说的,在我添加'req.on('close')....'这个让我陷入麻烦的语言之前,它工作得很好。 –

0

试着做类似complete: function(){reload}的东西,这样ajax会在完成删除功能后重新加载。

(附注:我已经碰到了这类问题之前,它只能在特定浏览器中工作,因为别人不支持delete法)

希望它能帮助!

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