这是我在expressjs(node)
中的json请求之后的回调function question(req, res){
request(req, res, function(response){
//redirect to the right url if page doesn't exist.
var params = app.req.params;
if(params.questionId && encodeURIComponent(params.slug) !== response.question.slug){
app.res.redirect(response.question.url);
}
//Render question
app.res.render('master',response);
});
}
以下是请求:
function request(req, res, callback){
app.req = req;
app.res = res;
http.get({
hostname: 'localhost',
port: 80,
path: req.url,
agent: false // create a new agent just for this one request
}, function(response){
response.setEncoding('utf8');
response.on('data', function(json){
json = JSON.parse(json);
console.log(json)
callback(json);
});
});
}
如果我触发res.redirect
,我会收到以下错误消息。我的期望是我被重定向到新的URL并且应该渲染app.res.render。无论我访问什么网址,此错误都会被触发一段时间。
_http_outgoing.js:344
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11)
at ServerResponse.header (/Users/kristoffer/web/zenqa2.1/node_modules/express/lib/response.js:718:10)
at ServerResponse.send (/Users/kristoffer/web/zenqa2.1/node_modules/express/lib/response.js:163:12)
at done (/Users/kristoffer/web/zenqa2.1/node_modules/express/lib/response.js:957:10)
at /Users/kristoffer/web/zenqa2.1/node_modules/mustache-express/mustache-express.js:168:5
at /Users/kristoffer/web/zenqa2.1/node_modules/mustache-express/mustache-express.js:131:10
at /Users/kristoffer/web/zenqa2.1/node_modules/mustache-express/mustache-express.js:118:11
at loadAllPartials (/Users/kristoffer/web/zenqa2.1/node_modules/mustache-express/mustache-express.js:79:10)
at /Users/kristoffer/web/zenqa2.1/node_modules/mustache-express/mustache-express.js:102:10
at /Users/kristoffer/web/zenqa2.1/node_modules/async/lib/async.js:232:13
答案 0 :(得分:0)
对于单个请求,只会发送一个响应。您必须在发送响应之前设置标头。 app.res.redirect
和app.res.render
用于传递回复。所以实际上你只能使用其中一个。使用return
退出代码或使用else
条件。
function question(req, res){
request(req, res, function(response){
//redirect to the right url if page doesn't exist.
var params = app.req.params;
if(params.questionId && encodeURIComponent(params.slug) !== response.question.slug){
return app.res.redirect(response.question.url); // return
}
// also you can use else condition here
app.res.render('master',response);
});
}
答案 1 :(得分:-1)
重定向后,您应该阻止任何进一步的代码执行。
http标头定义了cookie等。 如果要设置它们,请在实际关闭http标头之前执行此操作。
在http流中检测到两个以下换行符后,正文将开始。 在身体开始之后,您无法再添加标题信息
只要您使用重定向,它就会将http重定向标头以及htmls主体内的元重定向排队。