在$ .ajax之后,完成函数永远不会调用

对于所有这些(包括Javascriptcallback和ES6)我有点新鲜。 我正在使用NodeJS + Express + MongoDB。

我正在调用一个Ajax函数来更新一个项目,Ajax调用的成功从来没有完成。

这是我的Ajax调用(从React调用)

editBug : function(bug){ console.log('about to edit bug with these values',bug); $.ajax({ url:'/api/bugs', method: 'PUT', data:bug }) .done((jqxhr) => { console.log('succcess while editing the bug'); this.setState({successVisible : true}); }) .fail((jqxhr) => { console.log('error : ' + jqxhr); }) }, 

这是我的API函数:

 app.put('/api/bugs',function(req,res){ //console.log('req',req); console.log('query string : ',req.query); console.log('query params : ',req.params); console.log('query body: ',req.body); let id = new ObjectID(req.body._id); req.body._id = new ObjectID(req.body._id); db.collection('bugs').replaceOne( {_id:id}, req.body, function(err,result){ assert.equal(err,null); console.log('Successfull replace!'); res.status(200); } ); }); 

Successfull replace! 日志正确显示在服务器端。 about to edit bug with these values正确地显示在正面。 但succcess while editing the bug日志的成功不会显示在前端,似乎.done调用永远不会执行。

问题是你没有发送任何回应到浏览器的节点端。 尝试下面的代码段,你应该很好去

另外,我想指出,你应该处理错误。 当出现错误时更新错误,最好的做法是通知浏览器使用500状态码,表明预期的操作失败。 我在下面的剪辑中添加了这个方面

 app.put('/api/bugs', function(req, res) { //console.log('req',req); console.log('query string : ', req.query); console.log('query params : ', req.params); console.log('query body: ', req.body); let id = new ObjectID(req.body._id); req.body._id = new ObjectID(req.body._id); db.collection('bugs').replaceOne({ _id: id }, req.body, function(err, result) { if (err) { console.log('Failed replace'); res.status(500).end(); // <- We set the response status code and end the request } else { assert.equal(err, null); console.log('Successfull replace!'); res.status(200).end(); // <- We set the response status code and end the request } } ); }); 

你不需要在Node.js端结束你的响应对象吗? 尝试添加res.end(); 或对您的响应对象的任何回应。

另外,你可以使用chrome(或任何其他浏览器)的networking选项卡来实际查看你的AJAX请求是如何结束的,以查看它们是否挂起或完成。