快速会话不会保存…除非我刷新我的浏览器?

我试图实现一个简单的login节点和expression,将login的用户信息存储在快速会话中。 这是我到目前为止

应用:

var express = require("express"); var cookieParser = require("cookie-parser"); var session = require("express-session"); var bodyParser = require("body-parser"); var app = express(); app.use( cookieParser(SESSION_SECRET) ); app.use( bodyParser.json() ); app.use( bodyParser.urlencoded({extended:true}) ); app.use( session({secret:SESSION_SECRET, resave:true, saveUninitialized:true, cookie:{httpOnly: false, secure:false, maxAge:COOKIE_MAX_AGE}}) ); // a couple app.use statements to serve static files from a public folde 

我的login路线是这样的:

 router.post("/login", function(request, response) { // authentication stuff. if the user is authenticated: request.session.userId = user._id; request.session.save(); response.json({success:true, user: user._id}); }); 

在其他地方,我有这个自动注入我的其他路线的用户信息:

 // inject currently-logged-in user info into all requests router.use(function(request, response, next) { // No session and no user ID means no user. So just go on. if( null == request.session || null == request.session.userId ) { console.log("No session here."); return next(); } // Try to find the user. Look up the user id in the db, then do this: request.user = dbUser; next(); }); // External Routes require("./routes/Login")(router); // this is where router.post("/login") is require("./routes/User")(router); // another route that looks up user info 

奇怪的是,在我第一次login之后,在随后的请求中,我发现会话不存在(TTY中的“没有会话”),但是当我刷新浏览器并第二次login时,它就在那里。

编辑:所以,简单的事件顺序是:

  1. 客户端: http.post(“/ login”,{userid:..,pw:…});
  2. 服务器用户注入路由失败,没有会话(没关系,因为我们要创build一个),所以调用next()
  3. 服务器login路由凭据确定,所以它应该创build一个会话。 然后它将响应返回给客户端。
  4. 客户端:服务器说我们很好去,所以:http.get(“/受保护的东西”)
  5. 服务器的用户注入路由失败,没有sesion(什么?应该已经创build了这一点)

编辑2:一些更多的信息。 它变得怪异? 这似乎只发生在服务器重新启动后,并且仅在第一次login尝试时发生。 一旦第一个用户能够login并获得一个会话,任何其他尝试login将会成功。 即使第一个用户注销。

在这一点上,我开始怀疑在快速会话中是否有错误。 存储会话variables的第一个调用由于某种原因而不起作用。


我也不确定问题出在哪里。 我的浏览器使用angular度非常简单的http请求,它正确地存储用户ID。 我可以很清楚地看到,json响应的数据对象是{success:true,user:(user id)},所以在这方面看起来一切正常。 我很难过 为什么不直接保存login路线中的会话信息?

软件包版本:

  • body-parser:1.12.3
  • cookieparsing器:1.3.4
  • 表示:4.12.3
  • 快速会议:1.11.1
  • angular度:1.3.15

经过大量的搞乱我终于设法解决了这个问题。 或者,也许这只是一个解决方法。 问题是我没有为服务器上的会话数据指定默认存储。 所以默认情况下,express是使用一个内存存储,显然不是那么好。

我现在正在使用connect-mongo作为会话存储,而事情似乎正在起作用,尽pipe我仍然怀疑某个地方存在一个错误。

为了完整起见,以下是我现在如何设置快递:

 var express = require("express"); var session = require("express-session"); var mongoose = require("mongoose"); var MongoStore = require("connect-mongo")(session); var app = express(); // same cookieparser, bodyparser, etc setup as before app.use( session( { secret:SESSION_SECRET, resave: true, saveUninitialized: false, rolling: true, store: new MongoStore({mongooseConnection:mongoose.connection}), cookie: { httpOnly: false, secure: false, maxAge:COOKIE_MAX_AGE } })); 

编辑:

对不起,我错了,我以为第一次打到/login路线是触发“没有会议在这里”的那个。 日志,这是有道理的给定的顺序。 我做了一个编辑,使事情更清晰一些

不过,我会build议看看passport.js而不是滚动自己的login代码: http : //passportjs.org/guide/username-password/