【问题标题】:Express.js session - redirect errorExpress.js 会话 - 重定向错误
【发布时间】:2017-07-19 23:54:07
【问题描述】:

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

【问题讨论】:

  • 此错误是因为您试图在res.status(403).end('SESSION EXPIRED'); 之后发送另一个响应。一旦您致电end(),您将无法再次发送回复。在这里查看stackoverflow.com/a/7086621/7096322
  • “出于隐私原因,我无法发布代码”您的代码不特殊
  • @Darkrum 我更新了帖子,提供了有关代码基本结构的更多详细信息。如果你能帮助我,那就太好了。

标签: javascript node.js session express frontend


【解决方案1】:

嗯,你的错误是不言自明的,你不能向同一个请求发送两次 HTTP 响应。一旦你做了res.status(403).end(),你实际上已经发送了响应,之后你就不能重定向了。

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

res.redirect(403, '/');

或者:

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

【讨论】:

  • 感谢您的帮助。当我阅读 API 时,我一定错过了那行。我更新了我上面的帖子,详细介绍了我的 Web 应用程序的设置方式(基本结构是我提到的示例)。
猜你喜欢
  • 2013-02-11
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
相关资源
最近更新 更多