2015-12-22 160 views
0

注:下面的代码使用了一个名为模块client-sessions by Mozilla如何保存与猫鼬文档时设置会话cookie

我有一个表格注册用户,并在表单提交一个POST发送到app.post("/register)(以下面的代码)。如果我然后转到/的主页路由,我可以看到输出用户信息的console.log(user)

这就是我想要的。

然而,

当我注册为新用户我预计会被重置,当我去到主页的路由第二次我希望看到新的用户信息输出到控制台 - 但我不知道。相反,我看到了第一个用户信息。我想知道为什么会话没有被重置,并被新的用户信息和/或我不理解的地方取代。

谢谢。

app.use(session({ 
    cookieName: 'session', 
    secret: "whatever", 
    duration: 30 * 60 * 1000, 
    activeDuration: 5 * 60 * 1000, 
})) 






app.get("/", function(req, res) { 
    if (req.session.user === undefined) { 
     res.render("index"); 
    } else { 
     User.findOne(req.session.user.email, function(err, user) { 

      console.log(user); //__________________This ALWAYS outputs the first user registered even if new users register 

     }) 
     res.render("index"); 
    } 
}) 


app.get("/register", function(req, res) { 
    res.render("register"); 
}) 





//_______________________________________________BEGIN registration 


app.post("/register", function(req, res) { 
    req.session.reset(); 
    var user = new User({ 
     firstName: req.body.firstName, 
     lastName: req.body.lastName, 
     email: req.body.email, 
     password: req.body.email, 
     subscribed: false 

    }).save(function(err) { 
     req.session.user = user; 
     res.redirect("/"); 
    }) 
}) 

//_______________________________________________END registration 

ANSWER

这个问题的答案是双重的。首先在下面接受的答案。

此外,将会话存储在保存方法中也没有意义。下面的已更正的代码

app.post("/register", function(req, res) { 

    var user = new User({ 
     firstName: req.body.firstName, 
     lastName: req.body.lastName, 
     email: req.body.email, 
     password: req.body.password, 
     subscribed: false 

    }) 

    req.session.user = user; // This needed to be outside the save method 

    user.save(function(err) { 

     res.redirect("/"); 
    }) 
}) 

回答

1

这不是会话问题,而是您的数据库查询。

而不是

User.findOne(req.session.user.email, function(err, user) { 

应该

User.findOne({email: req.session.user.email}, function(err, user) { 

否则,查询总是返回从用户收集的第一份文件。

+0

当我使用你的代码时,所有我从console.log(用户)返回的是空 – William

+0

确保'req.session.user.email'然后存在。例如。把'console.log(req.session.user.email)'db查询上面的一行来检查。实际上,将整个猫鼬文档存储到会话中并不是一个好主意,因为它将被'client-sessions'编码为一个cookie字符串。 –

+0

它没有被创建,但我不知道为什么。太令人沮丧了。我试图只存储电子邮件,而不是整个文件,它也没有工作。 – William