繁体   English   中英

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

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

我不能使用简单的for循环,因为request.save是一个函数。 所以我尝试了。 它完美地工作! 在添加request.save部分之前,我收到以下错误消息,该消息破坏了我的应用程序。

错误:发送标头后无法设置标头。

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);
           }
       });
  }
});

问题是当您执行.save()时,您传递了一个匿名函数,该函数会在出现错误的情况下完成响应。

这样就完成了第一个保存事件错误。

您应该在save回调之外完成响应。

也许使用事件来同步您的代码,或者更好地使用生成器。

在forEach循环之前:

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

然后您保存的请求:

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);

        }
    });

}

然后,在forEach循环之后,您应该在.save()回调中等待异步工作人员的结尾。

您可以使用事件包或生成器或promise模式。

这取决于您节点的版本。

同步代码后,您可以先完成响应检查中的错误:

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

或仅使用saveedResponses完成响应。

暂无
暂无

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

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