如何使用mongoose原生诺言(mpromise)find一个文件,然后保存

我试图重构callback地狱承诺。 我如何使用findById.exec()然后object.save()承诺?

exports.changeAnimalName = function(req, res) { var Animal = mongoose.model('Animal', animalSchema); Animal.findById(id, function (err, animal) { if (animal) { animal.name=req.body.name; animal.save(function (err, animalSaved) { if (err) return console.error(err); return res.send(animalSaved); }); } }); } 

你可以做这样的事情:

 // No need to import the model every time var Animal = mongoose.model('Animal', animalSchema); exports.changeAnimalName = function(req, res) { // return the promise to caller return Animal.findById(id).exec().then(function found(animal) { if (animal) { animal.name = req.body.name; return animal.save(); // returns a promise } // you could throw a custom error here // throw new Error('Animal was not found for some reason'); }).then(function saved(animal) { if (animal) { return res.send(animal); } // you could throw a custom error here as well // throw new Error('Animal was not returned after save for some reason'); }).then(null, function(err) { // Could be error from find or save console.error(err); // respond with error res.send(err); // or if you want to propagate the error to the caller // throw err; }); } 

或者你可以使用findByIdAndUpdate简化一下:

 var Animal = mongoose.model('Animal', animalSchema); exports.changeAnimalName = function(req, res) { // return the promise to caller return Animal.findByIdAndUpdate(id, { name: req.body.name }).exec().then(function updated(animal) { if (animal) { return res.send(animal); } // you could throw a custom error here as well // throw new Error('Animal was not returned after update for some reason'); }).then(null, function(err) { console.error(err); // respond with error res.send(err); // or if you want to propagate the error to the caller // throw err; }); }