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