使用Promises进行Mongoose错误处理

时间:2016-09-04 03:27:22

标签: javascript node.js mongoose promise es6-promise

我在我的Nodejs,REST API中使用mongoose和本机ES6承诺进行数据库管理。

我无法找到错误处理的最佳做法。我有一段看起来像这样的代码:

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,就像有时候mongoose查询一样。

任何帮助都将不胜感激。

修改:我使用findOne并手动修改日程安排,因为mongoose无法对其动态和嵌入的架构进行建模。

2 个答案:

答案 0 :(得分:1)

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会使该函数在更新之后返回元素,而不是

之前

答案 1 :(得分:0)

Mongoose promises使用跟随暴露的crud函数的callback(error, result){}机制,例如newElement.save( function( err, result){} )。如果发生任何错误,则拒绝承诺,这是逻辑。