Error: Can't set headers after they are sent (NodeJS)

Error: Can't set headers after they are sent (NodeJS)

我正在 Nodejs-Express-MongoDB 中构建一个类似 webapp 的电子商务,我想用以下代码实现的是在用户结帐后更新可用的商品库存。

当我尝试更新 for loop 中的库存时出现错误(没有按预期执行)。

router.get('/checkout',function(req,res){
 if (!req.session.cart) {
  return res.redirect('cart');
 }
 else{
  var cart = new Cart(req.session.cart);
  var order = new Order({
    user: req.user,
    cart: cart
  });

  order.save(function(err,result)
  {
    var products = cart.generateArray();
    console.log(products);

    for(var i=0; i<products.length; i++)
    {
      Item.findById(products[i].item._id ,function(err,findedItem){
        if(err) {
          res.json(err);
        }
        if(findedItem) {
          var stock=findedItem.stock;
          console.log("* AVAILABLE STOCK: "+stock);

          if(stock < products[i].qty){
            req.flash('info', 'Ups, we can't serve this order');
            return res.redirect('/items/cart');
          }
          else{
            console.log("wrrkd!");
            Item.updateItem(products[i].item._id,products[i].qty);
          } 
        }         
      })
    }
    req.session.cart=null;
    res.redirect('/items/home');
  })
 } 
});

首先使用 cart.generateArray(),我在 products 中存储了一个包含所有已购买商品的数组。然后我开始在我的商品模型(商店的所有商品所在的地方)中搜索商品,以便稍后更新库存。

因此,如果至少一种产品的数量高于可用产品的数量,我希望它停止并返回到购物车页面。如果没有,只需更新可用库存并转到主页。

Item.updateItem:

module.exports.updateItem = function(id,numItem,callback){
  Item.findById(id, function(err,findedItem){
    console.log("* UPDATING ITEM: "+findedItem.name);
    if(findedItem.stock > numItem){
      findedItem.stock -= numItem;
      findedItem.save(callback);
    } else if(findedItem.stock == numItem){
      Item.findByIdAndRemove(id,function(err) {
        if (err)
            res.send(err);
        else
          console.log("* DELETING ITEM: "+findedItem.name);
      });
    }
  })
}

我收到以下错误,我尝试调试但不知道如何解决:

Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:491:11)
    at ServerResponse.setHeader (_http_outgoing.js:498:3)
    at ServerResponse.header (C:\...\node_modules\express\lib\response.js:767:10)
    at ServerResponse.send (C:\...\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (C:\...\node_modules\express\lib\response.js:267:15)
    at C:\...\routes\items.js:58:17
    at C:\...\node_modules\mongoose\lib\model.js:3930:16
    at _init (C:\...\node_modules\mongoose\lib\query.js:2000:14)
    at completeOne (C:\...\node_modules\mongoose\lib\query.js:1995:5)
    at Immediate.<anonymous> (C:\...\node_modules\mongoose\lib\query.js:1520:11)
    at Immediate._onImmediate (C:\...\node_modules\mquery\lib\utils.js:119:16)
    at runCallback (timers.js:794:20)
    at tryOnImmediate (timers.js:752:5)
    at processImmediate [as _immediateCallback] (timers.js:729:5)

如果在设置headers之前写入输出,headers将自动设置。然后,当您重定向时,headers 已经设置,因此无法重定向。当您不想重定向时,您应该只写入输出。所以首先检查是否需要重定向。如果你不能检查它(无论如何这不是一件好事),你应该将输出保存在缓冲区中,然后在确定不需要重定向时将其写入输出。