Express.js会话 - 重定向错误

时间:2017-07-19 23:54:08

标签: javascript node.js session express frontend

当我执行下面列出的伪代码的代码时,我一直遇到这个错误(为了澄清,我的代码是基于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中)超时。

1 个答案:

答案 0 :(得分:0)

嗯,您的错误是自我解释,您不能向同一请求发送两次HTTP响应。一旦你res.status(403).end()你实际上已经发送了回复,你就无法重定向。

所以你可以做的只是发送一次响应。

res.redirect(403, '/');

或者:

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