ExpressJS在每次页面更改时创建一个新会话

时间:2013-02-24 06:27:31

标签: node.js express connect passport.js

我正在尝试像这样实施快递和护照会议:

  app.use(connect.bodyParser());
  app.use(express.cookieParser());
  app.use(express.session({
    cookie: {
      path: "/",
      httpOnly: true,
      maxAge: null
    },
    store: redisStoreConnect,
    secret: "something",
    key: 'pksy.sid'
  }));
  app.use(passport.initialize());
  app.use(passport.session());

  passport.serializeUser (user, done) ->
    done null, user.email
    return

  passport.deserializeUser (email, done) ->
    User.findOne
        email: email
      , (err, user) ->
        done err, user
        return 
    return

如果我导航到我网站中的某个页面,则会创建一个新会话并以redis格式存储。如果我刷新该页面,会话似乎仍然存在。如果我导航到新页面,或者即使关闭选项卡并重新打开到同一页面,也会创建一个新会话。

这特别令人沮丧,因为护照只验证为我的登录页面生成的会话。如何让我的会话持续跨页?

更新:谢谢@robertklep提醒我查看浏览器实际发回的cookie(我应该开始做什么)。事实证明,浏览器正在发回正确的cookie,并且身份验证正在运行。会话实际上是持久的,但由于某种原因,每个页面请求都会创建一个新会话(浏览器未使用)。我怎么能阻止这个?

2 个答案:

答案 0 :(得分:3)

“哦,你不知道浏览器不会发送带有favicon请求的会话cookie吗?”我的roomate说黑客,他的同类产品需要以下单行代码。

以后11个小时的调试就解决了这个问题:

app.use express.favicon()

Express正在像对待任何其他资源一样对待favicon,而浏览器正在制作一个专门的,显然没有cookie的请求。 Express假设此请求必须来自没有会话cookie的客户端,因此它为它们创建了一个新会话;一个永远不会被召唤的会议。 express.favicon()可以节省一天的时间!

答案 1 :(得分:0)

在我的情况下,我必须使用

app.use(passport.initialize());
app.use(passport.session());

app.use(app.router);

希望这可以提供帮助。