当我执行下面列出的伪代码的代码时,我一直遇到这个错误(为了澄清,我的代码是基于react-redux-universal-hot-example)
Error: Can't set headers after they are sent.
[2] at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11)
[2] at ServerResponse.header (/pathToUI/ui/node_modules/express/lib/response.js:718:10)
[2] at ServerResponse.location (/pathToUI/ui/node_modules/express/lib/response.js:835:8)
[2] at ServerResponse.redirect (/pathToUI/ui/node_modules/express/lib/response.js:874:8)
[2] at api.js:165:11
[2] at Layer.handle [as handle_request] (/pathToUI/ui/node_modules/express/lib/router/layer.js:95:5)
[2] at trim_prefix (/pathToUI/ui/node_modules/express/lib/router/index.js:312:13)
[2] at /pathToUI/ui/node_modules/express/lib/router/index.js:280:7
[2] at Function.process_params (/pathToUI/ui/node_modules/express/lib/router/index.js:330:12)
[2] at next (/pathToUI/ui/node_modules/express/lib/router/index.js:271:10
我正在尝试将用户重定向到主页(/)并且用户在登录后处于/ home。基本上,会话由快速会话中的计时器控制。当时间到了,我想将用户重定向到主页(下次发出请求时)。
以下代码将位于api.js file
中app.use( (req, res, next) => {
if (req.session.user != undefined) {
if(sessionNotOver)
Renew session
}
else if (sessionOver/ expired ) {
console.log('expired session');
res.status(403).end('SESSION EXPIRED');
res.redirect('/');
return;
//req.session.destroy();
} else {
console.log('session has no user, but it is: ' + JSON.stringify(req.session));
}
});
我能够正确跟踪会话,但我无法将用户重定向到主页。 您有什么技巧可以帮助我实现这一目标?将重定向放在其他地方(即在server.js?中)
对我来说会更好吗?我已经尝试过咨询多个stackoverflow帖子,我也做了很多谷歌搜索/测试,但似乎没有任何工作。我可能会误解一些东西,所以如果有人能澄清一些事情和/或给我一些提示,那就太好了。谢谢!
编辑所以我尝试按照下面提到的Shimon Brandsdorfer更改线路,但我的应用程序仍然没有重定向,现在它只是停留在加载屏幕上,这是另一个显示加载gif直到另一个计时器(在App.js中)超时。
答案 0 :(得分:0)
嗯,您的错误是自我解释,您不能向同一请求发送两次HTTP响应。一旦你res.status(403).end()
你实际上已经发送了回复,你就无法重定向。
所以你可以做的只是发送一次响应。
res.redirect(403, '/');
或者:
res.status(403).location('/').end('sesssion expired');