刷新页面时为什么会出现新会话(我在save()之后创建了会话)

时间:2016-07-07 00:34:14

标签: javascript node.js session express

我认为会话是为了保留用户用户计算机上的信息,直到它过期或我销毁它。我想要做的是,如果用户是匿名的,为他创建一个id,把它放在会话中,他在网站上的每个地方或点击我可以通过id存储属于匿名用户的DB记录中的东西。

我使用中间件检查用户是否在每次溃败时都使用护照登录,如果不是,我想创建req.session.anon。我将req.session.anon分配给保存anon时创​​建的ObjectId(请参阅代码)。第二次(页面刷新)用户应该有一个session.anon id,所以这个检查应该失败}else if(!req.session.anon){但它没有,我创建了另一个带有新ID的记录。

app.use(function(req, res, next){
    // console.log("req.user ::::  ", req.user.local.username)
    if(req.user){
        app.locals.userid = req.user._id;
        app.locals.username = req.user.local.username;
        console.log("req.user is there")
    }else if(!req.session.anon){
        var anon = new Anon()
        anon.save(function(err, data){
            console.log(data)
            req.session.anon = data._id

            console.log("req.session.anon " , req.session.anon);// prints out the ID
        })               
    }
    next();
});

会话设置

app.use(session({secret : "thisisastring",
                        saveUninitialized : true,
                        resave : true
}));

编辑我想现在它与在回调中设置req.session.anon = data._id有关。但是req.session是从控制台设置的

2 个答案:

答案 0 :(得分:1)

会话通常通过cookie与浏览器相关联。

使用fiddler查看会话cookie是否写入响应流,以及cookie是否与下一个请求一起发回。

也许您需要在初始if子句中移动next()并将其移动到else..save回调方法的底部,以确保会话在关闭之前附加到响应。

答案 1 :(得分:0)

您有一个排序问题。我不确定这会导致你的会话问题,但是你的做法绝对不正确。

anon.save()似乎是异步的。这意味着它完成了一段时间,然后调用它的回调。但是,在此之前你正在呼叫next()。因此,这意味着在调用req.session.anonnext()将不会到位,这意味着此请求的后续处理程序将看不到req.session.anon的值。可能是在添加req.session.anon之前发生了自动重新保存,因此无法保存。

你可以像这样解决这个问题:

app.use(function(req, res, next){
    // console.log("req.user ::::  ", req.user.local.username)
    if(req.user){
        app.locals.userid = req.user._id;
        app.locals.username = req.user.local.username;
        console.log("req.user is there")
        next();
    }else if(!req.session.anon){
        var anon = new Anon()
        anon.save(function(err, data){
            console.log(data)
            req.session.anon = data._id

            console.log("req.session.anon " , req.session.anon);// prints out the ID
            next();
        })               
    } else {
        next();
    }
});

等待更新会话后等待next()

由于不推荐使用resave功能,因此在修改会话后手动保存会话也是有意义的:

app.use(function(req, res, next){
    // console.log("req.user ::::  ", req.user.local.username)
    if(req.user){
        app.locals.userid = req.user._id;
        app.locals.username = req.user.local.username;
        console.log("req.user is there")
        next();
    }else if(!req.session.anon){
        var anon = new Anon()
        anon.save(function(err, data){
            console.log(data)
            req.session.anon = data._id;
            req.session.save(function() {
                console.log("req.session.anon " , req.session.anon);// prints out the ID
                next();
            });
        });
    } else {
        next();
    }
});