express - 多次更新后发送单个响应

标签 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 方法是一个 promise 。如何遍历所有项目并确保在发送单个成功响应之前更新所有项目?

最佳答案

There are three ways you can do

  1. Promise.all
  2. Co
  3. Async Await


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

关于express - 多次更新后发送单个响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48272754/

相关文章:

postgresql - 序列化 JOSNB 查询

node.js - 如何在 Windows 上设置 NODE_ENV=production?

javascript - 如何将 Node.js、MongoDb 和 Backbone.js 组合在一个应用程序中?

node.js - 如何在 sequelize 中使用非列变量

javascript - Sequelize 搜索 API 无法按预期运行 expressJS

node.js - Sequelize.sync({force : true}) keeps obsolete model schema

foreign-keys - Sequelize ,将列设置为来自另一个模式的表的外键

express - 渲染和重用 RactiveJS 组件/模板的简洁方法

javascript - *.ejs 文件中的变量错误

node.js - 将静态 URL 更改为动态 - NodeJS