为啥 catch 块不会触发并且应用程序停止在 node.js 中工作
Posted
技术标签:
【中文标题】为啥 catch 块不会触发并且应用程序停止在 node.js 中工作【英文标题】: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 块将被触发,谁能解释我为什么在节点应用程序中出现这种行为?
谢谢你!
【问题讨论】:
Related question. 不,不是。基本上,原因是try-catch
范围没有涵盖回调函数(带有user.save
行)。您应该使用 .catch
方法(或捕获失败承诺的替代方法)。
@raina77ow 是对的,如果放置在 try 中的一段代码异步执行,则不会触发 try catch。例如,超时的效果相同。
这是一种可能的方式,但不太方便。相反,我建议你承诺你的异步代码。
@raina77ow 我应该使用这个npmjs.com/package/q 库还是有更好的选择?
【参考方案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
);
););
【讨论】:
以上是关于为啥 catch 块不会触发并且应用程序停止在 node.js 中工作的主要内容,如果未能解决你的问题,请参考以下文章