Глубоко в моем стеке обещаний я делаю этот вызов:
function isNameAvailable(name) {
return registry.getName(name)
.then(function(result) {
return result ? false : true;
});
}
К сожалению, и это ошибка программирования, реестр не определен. Мое приложение node.js не печатало никаких сообщений об ошибках. Есть идеи, почему? Я использую библиотеку обещаний bluebird.
Изменить
Вот код вызова. Я только что добавил улов, но он ничего не ловит.
function _checkAvailability(name) {
return isNameAvailable(name)
.then(function(isAvailabile) {
if (isAvailabile) {
return true;
}
else {
throw new NameNotAvailable('Name "' + name + '" is not available');
}
})
.catch(function(error) {
console.log('isNameAvailable threw', error);
throw error;
})
}
В конечном итоге стек должен вернуться к функции, которая была вызвана express.js в результате HTTP-запроса. Это одно место, где я ловлю все ошибки и печатаю трассировку стека (но, очевидно, ничего не печатаю):
function createUser(req, res) {
userService.createUser(req.body)
.then(function(user) {
res.status(201).send(user);
})
.catch(function(error) {
log.trace(error);
res.status(500).send({'message': error.toString()});
});
}
isNameAvailable
? Выкинуло точно. - person Bergi   schedule 07.11.2015isNameAvailable
делает синхронноthrow
исключение. Это не будет перехвачено никаким обработчиком.catch()
возвращаемого значения, поскольку вы не возвращаете отклоненное обещание — методcatch
никогда не выполняется. Ошибка будет обнаружена и преобразована в отклонение, если вы делаете что-то вродеsomePromise.then(isNameAvailable)
(или.then(_checkAvailability)
в этом отношении) - person Bergi   schedule 07.11.2015isNameAvailable
не возвращает промис из-за ошибки программирования, поэтому мы не можем ожидать, чтоthen
иcatch
сработают. Похоже, мне вообще не следует менять код, а просто убедиться, что я могу отлаживать такие проблемы. - person Naresh   schedule 07.11.2015isNameAvailable()
, вам либо нужна попытка/поймать внутриisNameAvailable()
, либо вызывающемуisNameAvailable()
нужна попытка/поймать. Bluebird будет перехватывать исключения для вас только тогда, когда вы находитесь в обработчике.then()
. Но вы выдаете исключение ДО того, как доберетесь до обработчика.then()
. Итак, это просто обычное синхронное исключение. Он будет обработан только в том случае, если у вас есть код для его обработки. - person jfriend00   schedule 07.11.2015