NodeJs发送后不能设置标题 [英] NodeJs Can't set headers after they are sent

查看:156
本文介绍了NodeJs发送后不能设置标题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的项目中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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆