来自nodejs服务器的错误未传递回AJAX

时间:2018-10-21 14:39:45

标签: javascript jquery node.js ajax

我有以下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

2 个答案:

答案 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错误功能处理,并且节点服务器不会从事件循环中终止。