jQuery和Express - 成功和错误混淆了

时间:2017-04-29 05:49:13

标签: javascript jquery node.js ajax express

这是一个基本的问题,但它一直在唠叨我一段时间,到目前为止我找不到任何匹配的问题。所以,如果它太简单或重复,请道歉。

我有一个API路由(基于Express),我正在使用jQuery AJAX调用调用此路由。这是一个简单的存根来演示设置

$.ajax({
  url: "http://localhost:3000/admin/items/" + itemId,
  type: "POST",
  dataType: "json",
  data: itemData,
  contentType: "application/json",
  success: function(result){alert(result);},
  error: function(xhr, ajaxOptions, thrownError){
    alert("Could not update item details. Please try again later. Error: " + xhr.statusText);
  }
});

从服务器,我确认返回的状态代码是200,这是实现:

collection.update({ _id : mongo.ObjectID(req.params.id) }, req.body, function(err, result) {
  if(err){
    console.log("Error is: " + err);
    res.status(500).send("Could not update item with id: " + req.params.id);
  }else {
    if(result.result.n != 1){
     res.status(500).send("Could not find item with id: " + req.params.id);
    }
    else{
      console.log("Update successful");
      res.status(200).send("Successfully updated item id: " + req.params.id);
    }
  }
});

功能完美无缺,但在通话结束时,错误功能正在调用,我收到的警告是:“无法更新项目详细信息。请稍后再试。错误:确定”。我试过一个简单的res.send,没有明确设置状态代码,但不知何故它总是调用错误函数。我错过了什么?

1 个答案:

答案 0 :(得分:2)

继上面的评论之后,之所以发生这种情况,是因为dataType设置为期待JSON响应,但express表示不发送JSON。当jQuery尝试解析响应时,即使响应状态为200,也无法解析并抛出错误。

如果你想保留你在初始例子中发送的响应,只需从ajax请求中删除dataType就足够了,jQuery通常非常聪明地确定要返回的内容。

如果您想接收JSON数据(如评论中所述),请将响应代码替换为以下内容:

res.status(200).json({
  message: 'Successfully updated item',
  data: doc // document returned by mongo
});

请记住将错误响应更改为JSON。即使jQuery会转到错误块,但是由于错误的原因(无效的JSON而不是错误代码)这样​​的事情:

res.status(500).json({
  message: 'Server error occurred'
});