NodeJs发送后不能设置标题 [英] NodeJs Can't set headers after they are sent
问题描述
在我的项目中nodejs返回以下消息:
错误:发送后无法设置标题。
我在这个网站上看过很多问题,但是我仍然无法找到解决方案。请帮助!!!
这是我的代码:
routes.js
var mongodb = require(__ dirname +/ db.js);
var fs = require(fs);
var hbs = require(express3-handlebars);
var soap = require('soap');
var url =http://infovalutar.ro/curs.asmx?wsdl;
var index = null;
module.exports = {
home:function(req,res){
mongodb.db()。collection(categories)find({id:req.params.category} )对于(i = 0; i< data [j]),对于(j = 0; j< data.length; j ++){
.categories.length; i ++){
var link_path = data [j] .categories [i] .categories;
link_path.type = {data:req.params.categorie};
res .render(home,{
location:data [j] .id,
title:data [j] .page_title,
name:data [j] .name,
描述:data [j] .page_description,
mens_link:/ mens,
womens_link:/ womens,
data_id:data [j] .id,
type :req.params.categoriy,
cat:data [j] .categories,
类别:data [j] .categories [i] .categories
});
}
}
});
},
product_list:function(req,res){
mongodb.db()。collection(products)。find({primary_category_id:req.params.sub_category})toArray (v = 0; v< data [s] .image_groups)的函数(err,data){
(s = 0; s< data.length; s ++){
长度; v ++){
res.render(product_list,{
products:data,
mens_link:/ mens,
womens_link:/ womens ,
main:req.params.category,
sub:req.params.sub_category,
id:req.params.id,
});
}
}
});
},
single_product:function(req,res){
mongodb.db()。collection(products)。find({id:req.params.id})toArray (对于(v = 0; v< data [s] .image_groups.length; v ++){
for(s = 0; s< data.length; s ++) {
res.render(product,{
single_product:data,
mens_link:/ mens,
womens_link:/ womens,
main:req.params.category,
sub:req.params.sub_category,
id:req.params.id,
});
}
}
});
}
};
不幸的是,这不行。您正在调用使渲染引擎发送指定布局的数据并关闭连接的函数 render()
。这就是为什么你收到头文件已经发送错误。
函数 res.render()
每个请求一次调用一次。
创建一个数组 var response = []
并更改你的循环: / p>
var response = [];对于(i = 0; i var link_path =(j = 0; j< data.length; j ++)数据[j]的.categories [I] .categories;
link_path.type = {data:req.params.categorie};
response.push({
location:data [j] .id,
title:data [j] .page_title,
name:data [j] .name,
description:data [j] .page_description,
mens_link:/ mens,
womens_link:/ womens,
data_id:data [j] .id,
类型:req.params.categoriy,
cat:data [j] .categories,
类别:data [j] .categories [i] .categories
});
}
}
res.render('home',response);
在您的for循环中,将每个待渲染的项目推送到该数组中。 / p>
请注意,您将在 home
布局中获得响应中的一系列对象。
In my project nodejs returns the following message:
Error: Can't set headers after they are sent. I have watched many question in this website but i stil cant find solution. Please help.!!!
Thats my code:
routes.js
var mongodb = require(__dirname+"/db.js");
var fs = require("fs");
var hbs = require("express3-handlebars");
var soap = require('soap');
var url = "http://infovalutar.ro/curs.asmx?wsdl";
var index = null;
module.exports = {
home: function(req, res) {
mongodb.db().collection("categories").find({id: req.params.category}).toArray(function(err, data) {
for (j=0; j<data.length; j++) {
for(i=0; i<data[j].categories.length; i++) {
var link_path = data[j].categories[i].categories;
link_path.type = { data: req.params.categorie };
res.render("home", {
location: data[j].id,
title: data[j].page_title,
name: data[j].name,
description: data[j].page_description,
mens_link: "/mens",
womens_link: "/womens",
data_id: data[j].id,
type: req.params.categoriy,
cat: data[j].categories,
categories: data[j].categories[i].categories
});
}
}
});
},
product_list: function(req, res) {
mongodb.db().collection("products").find({primary_category_id: req.params.sub_category}).toArray(function(err, data) {
for (s=0; s<data.length; s++) {
for (v=0; v<data[s].image_groups.length; v++) {
res.render("product_list", {
products: data,
mens_link: "/mens",
womens_link: "/womens",
main: req.params.category,
sub: req.params.sub_category,
id: req.params.id,
});
}
}
});
},
single_product: function(req, res) {
mongodb.db().collection("products").find({id: req.params.id}).toArray(function(err, data) {
for (s=0; s<data.length; s++) {
for (v=0; v<data[s].image_groups.length; v++) {
res.render("product", {
single_product: data,
mens_link: "/mens",
womens_link: "/womens",
main: req.params.category,
sub: req.params.sub_category,
id: req.params.id,
});
}
}
});
}
};
Unfortunately it does not work that way. You are calling the function render()
that makes the rendering engine send the specified layout's data and close the connection. That is exactly why you are getting the headers already sent error.
The function res.render()
should only be called once per request.
Create an array var response=[]
and change your loops like this:
var response=[];
for (j=0; j<data.length; j++) {
for(i=0; i<data[j].categories.length; i++) {
var link_path = data[j].categories[i].categories;
link_path.type = { data: req.params.categorie };
response.push({
location: data[j].id,
title: data[j].page_title,
name: data[j].name,
description: data[j].page_description,
mens_link: "/mens",
womens_link: "/womens",
data_id: data[j].id,
type: req.params.categoriy,
cat: data[j].categories,
categories: data[j].categories[i].categories
});
}
}
res.render('home', response);
and in your for loops, push each of your to-be-rendered items into that array.
Note that you will get an array of objects in your response in your home
layout.
这篇关于NodeJs发送后不能设置标题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!