Обработка ошибок Mongoose с обещаниями

Я использую mongoose с собственными обещаниями ES6 для управления базой данных в моем Nodejs, REST API.

У меня возникли проблемы с поиском лучших практик обработки ошибок. У меня есть участок кода, который выглядит так:

Cities.findOne({'id': someid}).then((city) => {
  if (!city) throw 'No city found';
  //modify city.embedded.dynamic.field
  return city.save();
}).then((city) => {
  if (!city) throw 'City not saved';
  res.send(city);
}).catch((err) => {
  console.log(err);
});

Нужно ли мне проверять, является ли возврат city.save() неопределенным? Или ошибка в сейве будет ловиться в ловушке?

В документах неясно, может ли save() вернуть undefined, как это иногда делают запросы мангуста.

Любая помощь будет оценена по достоинству.

Изменить: я использую findOne и вручную изменяю расписание, потому что мангуст не может моделировать динамическую схему, а также встроенную.


person Jacky Chiu    schedule 04.09.2016    source источник


Ответы (2)


Обещания Mongoose используют механизм callback(error, result){}, который следует за незащищенными грубыми функциями, такими как newElement.save( function( err, result){} ). Если возникает какая-либо ошибка, промис отклоняется, и это логично.

person Flint    schedule 04.09.2016

findOne() вернуть обещание. Это resolved, когда возвращается результат, пустой он или нет. Это rejected, когда произошла ошибка. Пустым результатом для любого find() будет null, а не undefined.

Вы получите [TypeError: Cannot read property 'save' of null], если элемент, который вы пытаетесь сохранить, не существует.

Однако вы можете сделать это проще:

return Cities.findByIdAndUpdate(city._id, {$set:city}, {new: true} ).exec()
             .then( (city) => { res.send(city) } )

установка для параметра new значения true заставляет функцию возвращать элемент после обновления, а не до

person Flint    schedule 04.09.2016
comment
findByIdAndUpdate будет работать хорошо, но я не могу это использовать :( (добавлено редактирование в мой вопрос). Меня беспокоит, возможно ли, чтобы модель # сохранить не удалось, и все еще есть обещание resolved. - person Jacky Chiu; 04.09.2016