node.js - 使用 Mongoose 异步保存多个文档

标签 node.js express asynchronous mongoose async-await

我正在使用 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();

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

最佳答案

我们可以使用 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);    
}

希望对你有帮助

关于node.js - 使用 Mongoose 异步保存多个文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51862246/

相关文章:

javascript - 如何通过 Postman 将 JSON 发送到 NodeJS Express Server?

asynchronous - 运行 Perl6 套接字服务器时 MOAR 进程膨胀

javascript - JavaScript 中的异步数据检索

mysql - Sequelize 映射不能使用 max 和 col

sql - 如何将 NodeJS 变量输入到 SQL 查询中

javascript - 无需重复查询即可将一致数据从数据库传递给用户的正确方法

javascript - 多个 Express 路由器

javascript - 在 Node.js 项目上运行客户端 javascript

javascript - 使用node js从mongodb下载海量数据

javascript - 如何设计可以具有同步或异步响应的 API