【问题标题】:Done function never called after $.ajax$.ajax 之后从未调用过 Done 函数
【发布时间】:2017-04-11 00:29:23
【问题描述】:

我对这一切(包括 Javascript 回调和 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 调用永远不会执行。

【问题讨论】:

  • 你没有提到fail()是否被调用。
  • 您使用的是什么版本的 jquery?在 jquery 1.6 上添加了 Promise
  • @freedomn-m fail() 未被调用。
  • @guyfawkes jquery 3.1.1

标签: javascript jquery node.js ajax


【解决方案1】:

问题是您没有将任何响应发送回节点端的浏览器。试试下面的sn-p,你应该很高兴

另外,我想指出您应该处理错误。如果出现问题,更新bugs 时,最佳做法是使用 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
      }
    }
  );
});

【讨论】:

  • 太棒了!那行得通。我选择了您的答案作为正确答案,因为它比另一个答案更详细(也是正确的)。非常感谢您的快速帮助!关于处理错误的一点。实际上,我正在学习一个教程,这就是为什么我只做“快速”的事情。但你是完全正确的
【解决方案2】:

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

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

【讨论】:

  • 谢谢。 res.end() 确实有效!我没有想到这一点,因为在我使用 res.json(doc) 之前,它似乎可以完成所有工作(也关闭流)。
猜你喜欢
  • 2012-07-22
  • 1970-01-01
  • 2014-06-07
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
相关资源
最近更新 更多