这是一个基本的问题,但它一直在唠叨我一段时间,到目前为止我找不到任何匹配的问题。所以,如果它太简单或重复,请道歉。
我有一个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,没有明确设置状态代码,但不知何故它总是调用错误函数。我错过了什么?
答案 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'
});