【问题标题】:Send single response after multiple updates多次更新后发送单个响应
【发布时间】:2018-01-16 01:04:43
【问题描述】:

我有一组要传递给 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 方法是一个承诺。如何迭代所有项目并确保在发送单个成功响应之前更新所有项目?

【问题讨论】:

    标签: express sequelize.js


    【解决方案1】:

    你可以通过三种方式来做

    1. Promise.all
    2. 合作
    3. 异步等待

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-12
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      相关资源
      最近更新 更多