如何使用mongoose native promise(mpromise)查找文档然后保存

use*_*180 1 mongoose node.js promise express

我正在尝试重构回调地狱的承诺.如何使用findById.exe()然后object.save()使用promises?

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);
    });
   }
 });
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*ust 5

你可以这样做:

// 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;
  });
}
Run Code Online (Sandbox Code Playgroud)

或者你可以使用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;
  });
}
Run Code Online (Sandbox Code Playgroud)