Ошибка для переменной 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. Попробуйте зарегистрировать некоторое промежуточное программное обеспечение ошибки, чтобы узнать, вызвана ли она с вашей ошибкой.