我有以下AJAX
会将输入的数据发送到节点服务器,而controller
将检查数据库中是否存在此类数据。
如果我输入正确,则一切正常。
但是,我尝试输入数据库没有的任何内容,它立即引发错误,导致服务器停止。该错误表示我没有处理该事件,因此我尝试在res.json(err)
中使用controller
而不是throw new Error
,希望将错误传递回{{1 }}键,但仍然无法正常工作。错误仍然被抛出,节点服务器自行终止。
我希望服务器继续运行,并警告用户输入的数据不在数据库中,但是我不知道为什么我的方法不正确。 如果可以首先从服务器端获取错误消息,我就在考虑使用此SO线程。 jQuery Ajax error handling, show custom exception messages
要解决服务器停止运行的问题,我使用了error
中从此链接引用的代码
How do I prevent node.js from crashing? try-catch doesn't work
我不确定我是否应该对案件使用已接受的答案。
app.js
控制器文件
function createProduct(inputval){
let inputAction = window.location.pathname;
$.ajax({
type: "POST",
url: inputAction,
data: {order: inputval.split('-')[0].trim(), lot: inputval.split('-')[1].substring(0,5)},
success: function(data) {
$('#product').val('');
//Another function to add HTML
display(data);
},
error: function(jqXHR, textStatus, errorThrown) {
console.log("XHR" + jqXHR)
console.log("Status" + textStatus)
console.log(errorThrown)
}
});
}
主文件:
exports.createProduct = function (req, res) { db.Product.findOne({ "order": req.body.order, "lot": req.body.lot }).exec(function (err, product) { if (!product || err){ throw new Error("The product entered returns null"); } res.json(product); }); };
app.js
答案 0 :(得分:1)
您应使用正确的状态码进行回复。我建议像下面的片段一样更改您的控制器
exports.createProduct = function (req, res) {
db.Product.findOne({ "order": req.body.order, "lot": req.body.lot }).exec(function (err, product) {
if (err){
res.status(500).end();//means internal server error
} else if (!product) {
res.status(404).end();//means product not found
} else {
res.json(product);
}
});
};
答案 1 :(得分:0)
由于其他社区的反馈,我终于弄明白了,所以我想在这里分享一下。忽略这样的陈述真是太愚蠢了。
首先,可以删除
app.js
中的代码。第二,基于@Milad Aghamohammadi给出的答案。不仅仅是:
res.status(500).end();
使用:
return res.status(500).json({err: "Server error"});
这样,该错误就可以由AJAX错误功能处理,并且节点服务器不会从事件循环中终止。