Say I've got this script:
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.'); }
And as you can see, I'd like to stop the script from executing any downstream functions if there's an error.
I've managed to achieve this by adding return;
after the error response is sent:
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.'); }
But is that the 'correct' way to do things?
Alternatives
I've also seen examples that use process.exit();
and process.exit(1);
, but that gives me a 502 Bad Gateway
error (I assume because it kills node?).
And callback();
, which just gave me an 'undefined' error.
What is the 'correct' way to stop a node.js script at any given point and prevent any downstream functions from executing?
Method 1: Using the Ctrl+C key I hope everyone knows this shortcut to exit any Node. js process from outside. This shortcut can be used to stop any running process by hitting this command on terminal.
When you click Call the function button, it will execute the function. To stop the function, click Stop the function execution button.
Using a return
is the correct way to stop a function executing. You are correct in that process.exit()
would kill the whole node process, rather than just stopping that individual function. Even if you are using a callback function, you'd want to return it to stop the function execution.
ASIDE: The standard callback is a function where the first argument is an error, or null if there was no error, so if you were using a callback the above would look like:
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.'); }
You should use return
, which will help you respond to what happened. Here's a bit cleaner version, basically first validate whatever you want to validate, rather than encapsulating everything in if{}else{} statements
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.'); }
Another way would be to use 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.'); }
Finally, examples that would stop entire app from further execution:
a) Throw an error, which will also help you debug the app (wouldn't completely stop the app, if the test()
function was wrapper in try{}catch(e){}
):
throw new Error('Something went wrong')
b) Stop script execution (works with Node.js):
process.exit()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With