如何停止执行node.js脚本?

时间:2014-03-12 21:37:37

标签: node.js exit

说我有这个脚本:

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脚本并阻止任何下游函数执行的“正确”方法是什么?

3 个答案:

答案 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()