【问题标题】:How to return response only once after iterating over an array in nodejs?迭代nodejs中的数组后如何仅返回一次响应?
【发布时间】:2020-04-21 00:58:40
【问题描述】:

我在这里迭代一个数组并将其保存到数据库中。迭代完成后,我只需向前端发送一次响应(不在循环内),这是我的代码。我将一个名为 create quest 的布尔值声明为 false;在迭代数组中的所有元素后,我必须通过检查布尔值是否为真来返回响应?但是在完成循环之前,如果条件正在执行/下面,那么时间布尔值仍然是假的;之后第 9 行将开始执行。

              createQuest = false;
              questionList.forEach(element => {
                var quest = new Questionnaire({
                    _id: new mongoose.Types.ObjectId(),
                    question: element.question,
                    blockId: blockId
                });
                quest.save((err1, doc1) => {
9:                    if(!err1){
                       createQuest = true;
                    }else{
                        res.send({'message':'failed'});
                    }
                })
            });
            if(createQuest == true){
              res.send({'message':'success'});
            }

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    根据您的实施方式,您可以执行以下操作:

      var counter = 0;
      questionList.forEach(element => {
        var quest = new Questionnaire({
            _id: new mongoose.Types.ObjectId(),
            question: element.question,
            blockId: blockId
        });
        quest.save((err1, doc1) => {
             if(!err1){
               counter++;
            }else{
               counter++;
                //res.send({'message':'failed'});
            }
        })
     if(counter == questionList.length) {                
      res.send({'message':'success'});            
     }
    });
    

    您也可以使用promise.all 来实现这一点。

    【讨论】:

    • 问题是 "if(counter == questionList.length)" 块会在执行 quest.save() 之前先执行
    【解决方案2】:

    如果您的目的是保存所有任务然后发送响应,那么您可以这样做:

            let createQuest = false;
            let quests = questionList.filter(element => {
                return {
                    _id: new mongoose.Types.ObjectId(),
                    question: element.question,
                    blockId: blockId
                });
            });
            Questionnaire.create(quests, function(err) {
                if(err)
                   return res.send({'message':'failed'});
                res.send({'message':'success'});
            });
    

    【讨论】:

      【解决方案3】:

      通过遍历数组(任何集合)运行多个并行任务,一旦它们全部完成,就执行其他任务 考虑需要更新多个的场景。你有问题被推送到一个数组中,你想执行所有相互依赖的函数。

      解决方案:使用 async.eachSeries() 这是解释相同的代码

      var async = require('async');
      
      async.eachSeries(questionList,function(element ,eachCb) {
         var quest = new Questionnaire({
              _id: new mongoose.Types.ObjectId(),
              question: element.question,
              blockId: blockId
          });
          quest.save((err1, doc1) => {
               if(!err1){
                 counter++;
              }else{
                 counter++;  
          return eachCb(err1);
              }
          eachCb();
          })
      },function(err,data) {
          if(err){
          console.log(err);
          }
        // Once all done, comes here.
      });
      

      供参考检查

      https://codeforgeek.com/asynchronous-programming-in-node-js/

      https://dzone.com/articles/how-to-interact-with-a-database-using-the-async-mo

      async.eachSeries in node.js

      (或)

      这里有两种使用 insertMany 和 save 保存数据的方法

      1) Mongoose 使用 insertMany 批量保存文档数组 db.collection.InsertMany()

      var Questionnaire= mongoose.model('Potato', Questionnaire);
      
       write this api in routes directory 
      router.post('/addDocuments', function (req, res) {
          const data = [/* array of object which data need to save in db */];
      
          Questionnaire.insertMany(data)  
          .then((result) => {
                  console.log("result ", result);
                  res.status(200).json({'success': 'new documents added!', 'data': result});
          })
          .catch(err => {
                  console.error("error ", err);
                  res.status(400).json({err});
          });
      })
      

      【讨论】:

        猜你喜欢
        • 2021-08-19
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 2018-02-27
        • 2014-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多