【问题标题】:Why catch block doesn't fire and application stop working in node.js为什么 catch 块不会触发并且应用程序停止在 node.js 中工作
【发布时间】:2015-12-23 06:19:53
【问题描述】:

我有以下代码:-

try {            
        user.findOne({ Email: req.body.email }, function (e, d) {
            if (d) {
                res.json({
                    'success': false,
                    'json': null,
                    'message': 'This email already exists!',
                    'status': 200
                });
            } else {
                var u = new user();
                u.Email = req.body.email;
                u.Password = req.body.password;
                u.Name = req.body.name;
                user.save(function (e, d) {
                    res.json(d);
                });
            }
        });
    } catch (ex) {
        console.log(ex.message + " \n" + ex.stack);
        res.json({
            'success': false,
            'json': ex,
            'message': 'Opps! something wen wrong please try again later!',
            'status': 500
        });
    }
}

我在user.save(function (e, d) { 线上有一个异常,我解决了这个问题,但问题是我看到 catch 块根本没有触发,并且节点服务器由于异常而停止。如果我将 try 块放入 user.findOne catch 块将被触发,谁能解释我为什么在节点应用程序中出现这种行为? 谢谢你!

【问题讨论】:

  • 不,不是。基本上,原因是try-catch 范围没有涵盖回调函数(带有user.save 行)。您应该使用 .catch 方法(或捕获失败承诺的替代方法)。
  • @raina77ow 是对的,如果放置在 try 中的一段代码异步执行,则不会触发 try catch。例如,超时的效果相同。
  • 这是一种可能的方式,但不太方便。相反,我建议你承诺你的异步代码。
  • @raina77ow 我应该使用这个npmjs.com/package/q 库还是有更好的选择?

标签: javascript node.js try-catch


【解决方案1】:

findOne 方法是异步过程,因此您的 try catch 语句不会捕获 Call Back 方法中发生的异常。您必须将 try catch 语句放在回调方法中以捕获异常。

     user.findOne({
 Email: req.body.email
 }, function(e, d) {
 try {
     if (d) {
         res.json({
             'success': false,
             'json': null,
             'message': 'This email already exists!',
             'status': 200
         });
     } else {
         var u = new user();
         u.Email = req.body.email;
         u.Password = req.body.password;
         u.Name = req.body.name;
         user.save(function(e, d) {
             res.json(d);
         });
     }
 } catch (ex) {
     console.log(ex.message + " \n" + ex.stack);
     res.json({
         'success': false,
         'json': ex,
         'message': 'Opps! something wen wrong please try again later!',
         'status': 500
     });
 }

 }););

【讨论】:

    猜你喜欢
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多