Javascript Mongoose承诺错误处理
我在nodejsrestapi中使用mongoose和本机ES6承诺进行数据库管理 我很难找到错误处理的最佳实践。我有一段代码如下所示:Javascript Mongoose承诺错误处理,javascript,node.js,mongoose,promise,es6-promise,Javascript,Node.js,Mongoose,Promise,Es6 Promise,我在nodejsrestapi中使用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 (!cit
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()
是否会像mongoose查询有时那样返回undefined
任何帮助都将不胜感激
Edit:我正在使用findOne
并手动修改计划,因为mongoose无法对模式建模,因为它是动态的和嵌入式的。findOne()
返回一个承诺。返回结果时,无论结果是否为空,它都已解析。当发生错误时,它被拒绝。任何find()
的空结果都将是null
,而不是未定义的
如果您试图保存的元素不存在,您将得到一个[TypeError:无法读取null的属性'save]
但是,您可以简化此过程:
return Cities.findByIdAndUpdate(city._id, {$set:city}, {new: true} ).exec()
.then( (city) => { res.send(city) } )
将选项
new
设置为true
会使函数在更新之后而不是更新之前返回元素Mongoose承诺使用遵循公开crud函数的回调(error,result){}
机制,例如newElement.save(function(err,result){}
。如果出现任何错误,承诺将被拒绝,这是合乎逻辑的。FindByiandUpdate将很好地工作,但我不能使用它:((在我的问题中添加了编辑)。我关心的部分是model#save是否可能失败,并且仍然可以解决它的承诺。