说我有这个脚本:
var thisIsTrue = false;
exports.test = function(request,response){
if(thisIsTrue){
response.send('All is good!');
}else{
response.send('ERROR! ERROR!');
// Stop script execution here.
}
console.log('I do not want this to happen if there is an error.');
}
正如您所看到的,如果出现错误,我想阻止脚本执行任何下游功能。
我设法通过在发送错误响应后添加return;
来实现此目的:
var thisIsTrue = false;
exports.test = function(request,response){
if(thisIsTrue){
response.send('All is good!');
}else{
response.send('ERROR! ERROR!');
return;
}
console.log('I do not want this to happen if there is an error.');
}
但那是“正确的”做事方式吗?
替代
我也看过使用process.exit();
和process.exit(1);
的示例,但这会给我一个502 Bad Gateway
错误(我假设它会杀死节点?)。
callback();
,它只是给了我一个'未定义'的错误。
在任何给定点停止node.js脚本并阻止任何下游函数执行的“正确”方法是什么?
答案 0 :(得分:35)
使用return
是停止执行函数的正确方法。你是正确的process.exit()
会杀死整个节点进程,而不是仅仅停止那个单独的函数。即使您使用回调函数,也要返回它以停止执行函数。
ASIDE:标准回调是一个函数,其中第一个参数是错误,如果没有错误则为null,因此如果您使用回调,则上面看起来像:
var thisIsTrue = false;
exports.test = function(request, response, cb){
if (thisIsTrue) {
response.send('All is good!');
cb(null, response)
} else {
response.send('ERROR! ERROR!');
return cb("THIS ISN'T TRUE!");
}
console.log('I do not want this to happen. If there is an error.');
}
答案 1 :(得分:2)
您可以使用 process.exit()
来立即强制终止一个 nodejs 程序。
您也可以通过相关的退出代码来说明原因。
process.exit() //default exit code is 0, which means *success*
process.exit(1) //Uncaught Fatal Exception: There was an uncaught exception, and it was not handled by a domain or an 'uncaughtException' event handler
process.exit(5) //Fatal Error: There was a fatal unrecoverable error in V8. Typically a message will be printed to stderr with the prefix FATAL ERROR
更多关于exit codes
答案 2 :(得分:0)
您应该使用return
,这将有助于您应对所发生的事情。这是一个比较干净的版本,基本上是先验证要验证的内容,而不是将所有内容封装在if {} else {}语句中
exports.test = function(request, response, cb){
if (!thisIsTrue) {
response.send('ERROR! ERROR!');
return cb("THIS ISN'T TRUE!");
}
response.send('All is good!');
cb(null, response)
console.log('I do not want this to happen. If there is an error.');
}
另一种方法是使用throw
exports.test = function(request, response, cb){
if (!thisIsTrue) {
response.send('ERROR! ERROR!');
cb("THIS ISN'T TRUE!");
throw 'This isn\'t true, perhaps it should';
}
response.send('All is good!');
cb(null, response)
console.log('I do not want this to happen. If there is an error.');
}
最后,示例将阻止整个应用进一步执行:
a)引发错误,这也将帮助您调试应用程序(如果test()
函数包装在try{}catch(e){}
中,则不会完全停止应用程序):
throw new Error('Something went wrong')
b)停止脚本执行(与Node.js一起使用):
process.exit()