【问题标题】:async save multiple document with mongoose使用猫鼬异步保存多个文档
【发布时间】:2019-01-22 12:57:42
【问题描述】:

我正在使用 mongoose.save() 更新 2 个文档,但我认为我这样做的方式并不安全,据我所知我需要使用异步来确保所有文档都正在执行

// array containing the 2 documents from db 
let schedules 
let newItem = {
   isActive: room.isActive,
   name: room.roomname
};

// adding new items to nested array
schedules[0].rooms.push(newItem);
schedules[1].rooms.push(newItem);

// saving / updating documents 


var total = schedules.length,
  result = [];

function saveAll() {
  var doc = schedules.pop();

  doc.save(function(err, saved) {
    if (err) throw err; //handle error

    result.push(saved);

    if (--total) saveAll();
    else {
      // all saved here
      res.json(result);
    }
  });
}

saveAll();

任何解释如何正确地做到这一点

【问题讨论】:

    标签: node.js express asynchronous mongoose async-await


    【解决方案1】:

    我们可以为此使用promise.all,但我们需要将您的save 函数更改为基于promise 的函数

    ...
    
    var total = schedules.length,
      result = [];
    
    function saveAll() {
      const promises = schedules.map(schedule => save(schedule));
      return Promise.all(promises)
        .then(responses => {
          // all saved processes are finished
          res.json(responses);
        })
    }
    
    // convert callback `save` function to promise based
    function save(doc) {
      return new Promise((resolve, reject) => {
        doc.save((err, saved) => {
          if (err) {
            reject(err);
          }
    
          resolve(saved);
        });
      });
    }
    

    如果您可以使用async/await,我们可以使saveAll 功能更清洁

    async function saveAll() {
      const promises = schedules.map(schedule => save(schedule));
      const responses = await Promise.all(promises);
    
      res.json(responses);    
    }
    

    希望对你有帮助

    【讨论】:

    • 使用 Promise.all( <array of mongo queries> ) 可能是个坏主意,因为与 mongo 的连接池有限(我认为默认值为 5),所以这个命令可能会淹没池数百毫秒(或其他),阻止此进程对 mongo 的所有其他访问。
    【解决方案2】:

    使用承诺:

    doc1.save().exec().then(
        data => {
    
            doc1.save().exec().then(
                data2 => console.log(data2)
            ).catch(err2 => console.log(err2))
        }
    ).catch(err1 => console.log(err1))
    

    【讨论】:

      猜你喜欢
      • 2013-10-23
      • 2017-02-22
      • 2017-12-05
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      相关资源
      最近更新 更多