Как остановить выполнение node.js script?
Скажем, у меня есть этот 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.');
}
И как вы можете видеть, я хотел бы остановить выполнение script от любых последующих функций, если есть ошибка.
Мне удалось достичь этого, добавив 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
(я предполагаю, что она убивает node?).
И callback();
, который просто дал мне ошибку undefined.
Каков "правильный" способ остановить node.js script в любой заданной точке и предотвратить выполнение любых последующих функций?
Ответы
Ответ 1
Использование return
- это правильный способ остановить выполнение функции. Вы правы в том, что process.exit()
убьет весь процесс node, а не просто остановит эту индивидуальную функцию. Даже если вы используете функцию обратного вызова, вы хотите вернуть ее, чтобы остановить выполнение функции.
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.');
}
Ответ 2
Вам следует использовать 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')
б) Остановить выполнение скрипта (работает с Node.js):
process.exit()