快递会话不会保存...除非我刷新浏览器?

时间:2015-05-01 01:40:52

标签: node.js express express-session

我尝试使用node和express实现简单登录,将登录用户的信息存储在快速会话中。这是我到目前为止所做的事情

应用:

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

我的登录路线是这样做的:

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

奇怪的是,在我第一次登录后,在后续请求中,我看到会话不存在("此处没有会话。"在TTY中)但是当我刷新我的浏览器并登录第二时,它就在那里。

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

  1. 客户端: http.post(" / login",{userid:..,pw:...});
  2. 服务器用户 - 注入路由失败,没有会话(因为我们即将创建一个会话,这很好),所以请调用next( )
  3. 服务器登录路由凭据确定,因此应创建会话。然后它将响应返回给客户端。
  4. 客户:服务器说我们很高兴,所以:http.get(" / protectedstuff")
  5. 服务器用户 - 注入路由失败,没有任何内容(什么?应该由此点创建)
  6. 编辑2:更多信息。它更奇怪了?这似乎只在服务器重新启动后才发生,并且仅在第一次登录尝试时发生。一旦第一个用户能够登录并获得会话,任何其他登录尝试都将成功。即使第一个用户注销。

    此时我开始怀疑快递中是否存在错误。第一次存储会话变量的调用由于某种原因而无法正常工作。

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

    包装版本:

    • body-parser:1.12.3
    • cookie-parser:1.3.4
    • express:4.12.3
    • express-session:1.11.1
    • angular:1.3.15

2 个答案:

答案 0 :(得分:1)

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

我现在使用connect-mongo作为会话存储,但事情似乎正在发挥作用,尽管我仍然怀疑某处有快递错误。

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

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
  }
}));

答案 1 :(得分:0)

<强>编辑:

对不起,我错了,我觉得/login路线的第一次击中就是触发了#34; No会话的路线。&#34; log,根据订购会有意义。我做了一个编辑,让事情变得更清晰

不过,我建议调查一下passport.js而不是滚动你自己的登录代码:http://passportjs.org/guide/username-password/