Ошибка для переменной undefined в node.js отсутствует с ошибкой

Я запускаю node.js с выражением. Я написал модуль node с методами в нем, поэтому, когда вы идете в http://bla.com/module_name/method_name он будет запускать метод.

Метод следует типичному стилю

exports.method_name(req, res, next);

мое главное приложение делает что-то вроде этого:

app.all("*", resSetup, controller, render);

и контроллер - это то, что вызовет метод, основанный на пути.

Кажется, что если в методе есть ошибка undefined переменной, выражение будет просто зависать там и не вызывать никаких ошибок. В журнале консоли ничего не появится. Я могу поставить консольное сообщение до и после того, где произошла ошибка, и до этого появится в журнале, а после не будет.

Я могу обернуть его в try/catch и получить следующее:

[ReferenceError: blabla is not defined]

но не номера строк или что-то еще.

Мое предположение заключается в том, что экспресс как-то предотвращает появление ошибок. Когда я помещаю ошибку в функцию, называемую "контроллер", которая находится прямо на маршруте, она корректно показывает эту ошибку.

Это не имеет большого значения, но вот код, над которым я работаю:

https://github.com/RobKohr/quick-site/blob/master/index.js

Строка 189 - это вызов метода.

Ответ 1

Основываясь на комментарии Ruairi выше, у меня была эта же проблема при использовании "q" (https://github.com/kriskowal/q) и promises с помощью выражения - node зависает и не генерируется ошибка.

Добавив улов к концу цепочки "callback" обещания, я смог увидеть ошибку и распечатать ее на консоли и т.д.

Код выглядит следующим образом:

export function index(req, res) {

    //Create the 'promise'
    var request = req.body;
    var queryJobID = req.query.jobId;
    console.log('queryJobID: ' + queryJobID);
    var jobStatusPromsie = jobManager.job.getStatus(queryJobID);

    Q.all([jobStatusPromsie])
    .then(
        function (result) {
            var responseData = {};
            console.log('Job Status Response received');
            if (result != null) {
                //Without the .catch below an error here will be 'silent'
                console.log('jobStatus result: ' + util.inspect(result, false, null));
                responseData['status'] = 'OK';
                responseData['progress'] = result.progress;
                res.json(responseData);
            } else {
                console.log('jobStatus Error');
                responseData['status'] = 'Error';
            }
            res.json(responseData);
            console.log('jobStatus Response data sent');
        },
        function (error) {
            console.log('Error while getting job status:', error);
            res.json("Error");
        })
    .catch(function(err) {
        //handle errors
        console.log('Promise error while getting job status:', err);
    }); 
}

Ответ 2

  • Экспресс сильно зависит от асинхронности узлов Nodes. Видя ошибки, подобные тому, что было написано в строке 30, я дал бы мне крипы, если бы я поддерживал это. Попробуйте рефакторинг кода, чтобы использовать только следующий шаблон (err).

  • Причина, по которой вы используете приложение, заключается в том, что Express не завершил HTTP-запрос (например: res.send()). Это означает, что вы повредили сантехнику, где ошибка запустила стек вызовов, но не перенаправлена ​​в конвейер промежуточного программного обеспечения Express. Попробуйте зарегистрировать некоторое промежуточное программное обеспечение ошибки, чтобы узнать, вызвана ли она с вашей ошибкой.