2017-07-19 42 views
0

予保持时,我执行我的代码,其具有以下列出的伪码遇到此误差(为了澄清,我的代码是基于反应-Redux的万能-热示例)Express.js会话 - 重定向错误

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 

我试图将用户重定向到主页(/)和用户是已经登录后/家。基本上,会由快递会话的定时器控制。当时间到了,我想将用户重定向到主页(下一次发出请求)。

下面的代码将在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?

我已经试过多次协商计算器的帖子,我也做了很多的谷歌搜索/测试,但似乎没有任何工作。我可能会被误解,虽然东西,所以这将是很好,如果有人可以澄清一些事情和/或给我一些提示。谢谢!

编辑所以我试图改变行西蒙Brandsdorfer下面提到的,但我的应用程序仍然不重定向,现在它只是停留加载屏幕上是显示加载GIF,直到其他计时器另一个组件(在App.js中)超时。

+0

这个错误是因为你要发送res.status(403).END后'另一个响应( '会话已超时');'。一旦调用'end()',你就不能发送另一个响应。请在这里https://stackoverflow.com/a/7086621/7096322 –

+0

“我不能发布隐私的原因码”你的代码没有特殊 – Darkrum

+0

@Darkrum我已经更新了帖子有关代码的基本结构的详细信息。如果你能帮助我,那会很棒。 –

回答

0

那么,你的错误是自我解释,你不能发送两次相同的请求HTTP响应。一旦你做了res.status(403).end()你实际上已经发送的响应,你不能事后重定向。

所以,你可以做什么,仅仅是发送响应一次。

res.redirect(403, '/'); 

或者:

res.status(403).location('/').end('sesssion expired'); 
+0

谢谢你的帮助。当我阅读API时,我一定错过了那条线。我更新我的帖子上面有我的web应用程序是如何设置(基本结构是我提到的例子)的更多细节。 –