【问题标题】:jQuery and Express - success and error getting mixed upjQuery 和 Express - 成功和错误混为一谈
【发布时间】:2017-04-29 05:49:12
【问题描述】:

这是一个基本问题,但它一直困扰着我一段时间,到目前为止,我在搜索中找不到任何匹配的问题。所以,如果过于简单或重复,请见谅。

我有一个 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 也没有显式设置状态代码,但不知何故它总是调用错误函数。我错过了什么?

【问题讨论】:

  • 返回的数据不是JSON,去掉dataType: 'json'这一行
  • 发送的 itemData 是 JSON,因此是 dataType。我也应该返回 JSON 响应吗?该响应 JSON 是否有推荐的结构?到目前为止,我看到的所有示例都只返回字符串。
  • 使用.json 代替.send,然后传递一个对象,该对象包含一个包含字符串响应的message 字段和一个包含数据的data 字段
  • 效果很好。所以jQuery客户端期望响应是一个有效的JSON,不管状态码,如果dataType设置为JSON?
  • 没错。如果它是无效的 JSON,则会引发错误。

标签: javascript jquery node.js ajax express


【解决方案1】:

除了我上面的评论之外,发生这种情况的原因是因为 dataType 设置为期望 JSON 响应,但 express 不发送 JSON。当 jQuery 尝试解析响应时,即使响应状态为 200,它也无法解析并抛出错误。

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

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

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

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 2019-01-13
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2013-03-11
    • 2023-03-23
    • 2012-02-24
    相关资源
    最近更新 更多