NodeJS +猫鼬等待子查询

时间:2019-09-16 17:56:18

标签: javascript node.js mongoose

我有两个模型:ModelAModelB,我试图将tags = Array()的{​​{1}}列复制到ModelB中,如下所示:

ModelA

该脚本显然用function run() { ModelA.find({}).limit(500).cursor() .on('data', function(doc) { let refID = doc.ref_id; ModelB.findOne({_id: refID}).exec(function(err, modelb) { if (err) { console.log(`[Error]: Getting modelb ${refID}`); } if (modelb) { if (modelb.tags.length > 0) { doc.tags = modelb.tags; } } }); doc.processed = true; doc.save(function(err, hackAlert) { if (err) { console.log('[Error]: Saving ModelA: ' + err); } console.log(`Saved: ${doc._id}`); }); }) .on('error', function(err){ console.log('[Error]'); }) .on('end', function(){ console.log('Done'); }); } 保存了所有ModelA实例,但是鉴于Node的异步特性,processed = true文档最终没有ModelA

如果您不知道,我是新手。我想知道在保存tags之前完成"await"查询的ModelB.findOne()最佳现代方法是什么?

1 个答案:

答案 0 :(得分:1)

您可以简单地将要在第一个查询的回调上调用的代码移动:

function run() {

  ModelA.find({}).limit(500).cursor()
    .on('data', function(doc) {
      let refID = doc.ref_id;

      ModelB.findOne({_id: refID}).exec(function(err, modelb) {
        if (err) {
          console.log(`[Error]: Getting modelb ${refID}`);
        }
        if (modelb) {
          if (modelb.tags.length > 0) {
            doc.tags = modelb.tags;
          }
        }
        doc.processed = true;
        doc.save(function(err, hackAlert) {
          if (err) {
            console.log('[Error]: Saving ModelA: ' + err);
          }
          console.log(`Saved: ${doc._id}`);
        });
      });
    })
    .on('error', function(err){
      console.log('[Error]');
    })
    .on('end', function(){
      console.log('Done');
    });
}

有关使用async/awaitPromises的最新方法:

async function run () {

  ModelA.find({}).limit(500).cursor()
    .on('data', async function (doc) {
      let refID = doc.ref_id;
      const modelb = await ModelB.findOne({_id: refID}).exec()
        .catch(() => console.log(`[Error]: Getting modelb ${refID}`));

      if (modelb) {
        if (modelb.tags.length > 0) {
          doc.tags = modelb.tags;
        }
      }
      doc.processed = true;
      await doc.save().exec()
        .catch(err => console.log('[Error]: Saving ModelA: ' + err))

      console.log(`Saved: ${doc._id}`);
    })
    .on('error', function (err){
      console.log('[Error]');
    })
    .on('end', function () {
      console.log('Done');
    });
}