简体   繁体   English

遍历整个数组迭代保存在Node.JS中

[英]Iterate save in Node.JS across an array

I couldn't use a simple for loop because request.save is a function. 我不能使用简单的for循环,因为request.save是一个函数。 So I tried forEach. 所以我尝试了。 It works perfectly! 它完美地工作! Until I add in the request.save part and I get the following error message that breaks my app. 在添加request.save部分之前,我收到以下错误消息,该消息破坏了我的应用程序。

Error: Can't set headers after they are sent. 错误:发送标头后无法设置标头。

exports.submit = function (req, res) {


  Person.find({
      cellPhone: req.body.phone
  }).exec(function (err, people) {
      people.forEach(saveRequest);
  }

  function saveRequest(item, index) {

       var request = new Requests();
       request.start = req.body.start.value;
       request.finish = req.body.finish.value;
       request.phone = req.body.phone;
       request.offDay = req.body.date;

       request.user = people[index]._id;
       request.name = people[index].name;
       request.group = people[index].group;

       request.save(function (err) {
          if (err) {
             console.log('request.save');
             return res.status(400);
           } else {
             // Remove sensitive data before login
             //user.password = undefined;
             //user.salt = undefined;
             console.log(request);
             res.json(request);
           }
       });
  }
});

The problem is when you perform the .save() you pass an anonymous function that complete the response in case of error. 问题是当您执行.save()时,您传递了一个匿名函数,该函数会在出现错误的情况下完成响应。

So you finish on the first save event error. 这样就完成了第一个保存事件错误。

You should complete the response outside the save callback. 您应该在save回调之外完成响应。

Maybe use events to sync your code, or better the generators. 也许使用事件来同步您的代码,或者更好地使用生成器。

Before your forEach loop: 在forEach循环之前:

let savedResponses = [];
let savedErrors = [];
...

Then your savedRequest: 然后您保存的请求:

function saveRequest(item, index) {

    var request = new Requests();
    request.start = req.body.start.value;
    request.finish = req.body.finish.value;
    request.phone = req.body.phone;
    request.offDay = req.body.date;

    request.user = people[index]._id;
    request.name = people[index].name;
    request.group = people[index].group;

    request.save(function (err) {
        if (err) {
            console.log('request.save error');
            savedErrors.push(err);
            // return res.status(400);
        } else {
            // Remove sensitive data before login
            //user.password = undefined;
            //user.salt = undefined;
            console.log(request);
            savedResponses.push(request);

        }
    });

}

Then after the forEach loop, you should wait the end of the asynchronous staff in the .save() callbacks. 然后,在forEach循环之后,您应该在.save()回调中等待异步工作人员的结尾。

You could use the event package or the generators or the promise pattern. 您可以使用事件包或生成器或promise模式。

It depend on the version of your node. 这取决于您节点的版本。

When you have the code synched you could just complete your response checking for errors first: 同步代码后,您可以先完成响应检查中的错误:

if (savedErrors.length > 0) {
    res.status = 400;
    // ... report errors
}

Or just complete the response with the savedResponses . 或仅使用saveedResponses完成响应。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM