jQuery和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); } } }); 

该function完美的工作,但在调用结束时,错误函数被调用,我得到的警报是:“无法更新项目的详细信息,请稍后再试。错误:确定”。我尝试了一个简单的资源.send没有明确地设置状态码,但不知何故总是调用错误函数。 我错过了什么?

除了上面我的评论,这是发生的原因是因为dataTypetypes设置为期望一个JSON响应,但expression不发送JSON。 当jQuery尝试parsing响应时,即使响应状态为200,也无法发出错误并引发错误。

如果你想保留你在初始例子中发送的响应,简单地从ajax请求中删除dataType就足够了,jQuery通常很聪明地找出返回的内容。

如果您希望接收JSON数据(如注释中所述),请将您的响应代码replace为以下内容:

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