多次更新后发送单个响应

时间:2018-01-16 01:04:43

标签: express sequelize.js

我有一系列项目,我将其传递给API端点(使用Sequelize作为我的ORM)。我正在尝试迭代每个项目并更新它,但是我得到了Unhandled rejection Error: Can't set headers after they are sent.

stepsController.put = (req, res) => {
  const { steps } = req.body;
  // Steps is an array of objects that I want to update...
  steps.map(step => {
    Step.findOne({ where: { id: step.id } })
      .then(savedStep =>
        savedStep
          .update({
            order: step.order,
          })
          .then(success => res.status(200).send(success))
          .catch(error => res.send(error))
      )
      .then(ok => res.status(200).send(ok))
      .catch(err => res.send(err));
  });
};

我相信这是因为它正在发送每个项目的回复。 Sequelize的update方法是一种承诺。如何在发送一个成功的响应之前迭代所有项目并确保所有项目都已更新?

1 个答案:

答案 0 :(得分:0)

  

有三种方法可以做

     
      
  1. Promise.all
  2.   
  3.   
  4. Async Await
  5.   

1)在这里,您可以使用Promise.all

stepsController.put = (req, res) => {
    const { steps } = req.body;
    // Steps is an array of objects that I want to update...
    Promise.all(steps.map(step => {
        return Step.findOne({ where: { id: step.id } }).then(savedStep =>
                return savedStep.update({
                    order: step.order,
                })
                .catch(error => error)
        ).catch(err => err)
    }))
    .then(ok => res.status(200).send(ok))
    .catch(err => res.send(err));
};

2)另一种方法是使用co

const co = require('co');

stepsController.put = co.wrap(function* (req, res) => {
    try {
        const { steps } = req.body;
        // Steps is an array of objects that I want to update...  
        for(let i=0;i<steps.length ; i++) {
            let savedStep = yield Step.findOne({ where: { id: steps[i].id } });
            if(savedStep)
                yield savedStep.update({ order: steps[i].order});
        }
        res.status(200).send();
    }
    catch(err){
        res.send(err);
    }
});

3)如果你使用的是Node 8.0+,则不需要任何可以直接使用的软件包async await

stepsController.put = async(req, res) => {
    try {
        const { steps } = req.body;
        // Steps is an array of objects that I want to update...  
        for(let i=0;i<steps.length ; i++) {
            let savedStep = await Step.findOne({ where: { id: steps[i].id } });
            if(savedStep)
                await savedStep.update({ order: steps[i].order});
        }
        res.status(200).send();
    }
    catch(err){
        res.send(err);
    }
};