【问题标题】:Express.js: Can't redirect after using session middlewareExpress.js:使用会话中间件后无法重定向
【发布时间】:2012-06-22 12:22:19
【问题描述】:

我正在编写一个身份验证中间件,它应该在成功登录我们的注销后重定向到以前访问过的页面。这是完整的配置块:

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.static(__dirname + '/public'));
  app.use(express.bodyParser());
  app.use(express.cookieParser());
  app.use(express.session({ secret: '__YouDontKnow__', store: new RedisStore }));
  app.use(authCheck.run);
  app.use(express.methodOverride());
  app.use(app.router);
});

现在当app.use(authCheck.run)app.use(express.session) 之下时,Express 会抛出错误:错误:发送后无法设置标头。

如果我将这个调用移到app.use(express.session) 之上,它会抛出一个 500 错误,指出 session 未定义。而我的身份验证功能取决于会话对象。

我能做什么?

编辑:这里是 authCheck 函数:

exports.run = function (req, res, next) {
  var urlparser = GLOBAL.urlparser,
      url = req.urlp = urlparser.parse(req.url, true),

      goToLastPage = function() {
        var redirectUrl = (req.session.lastVisitedPage) ? req.session.lastVisitedPage : '/';
        console.log("goToLastPage(%s)", redirectUrl);
        res.redirect(redirectUrl);
        return;
      }

  // Log out
  if (url.pathname == '/user/logout') {
    req.session.destroy();
    console.log('User has logged out');
    goToLastPage();
  }

  // Log in
  if (url.pathname == '/user/login' && req.method == 'POST') {
    var email = req.body.login.email,
        password = req.body.login.password;

    req.session.auth = true;
    req.session.userId = 1;

    console.log('User has logged in');

    goToLastPage();
  }

  next();
  return;
}

【问题讨论】:

  • 您能否提供更多有关 authCheck.run 的信息
  • 有什么路线吗?你有什么特别的事情会引发错误吗?

标签: node.js session express


【解决方案1】:

在拨打goToLastPage() 后添加return。在您调用 res.redirect 之后,您仍然在调用 next(),它调用链中的下一个中间件,最终可能最终到达您的一条路由,然后尝试设置标头并失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    相关资源
    最近更新 更多