Как остановить выполнение 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()