【问题标题】:How to set session cookie when saving a document with mongoose使用猫鼬保存文档时如何设置会话cookie
【发布时间】:2015-12-22 14:20:11
【问题描述】:

注意:下面的代码使用了一个名为client-sessions by Mozilla的模块

我有一个注册用户的表格,在提交表格时,一个 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

回答

这个问题的答案有两个。首先是下面接受的答案。

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

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("/");
    })
})

【问题讨论】:

    标签: javascript node.js forms session mongoose


    【解决方案1】:

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

    而不是

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

    应该是

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

    否则,查询总是返回用户集合中的第一个文档。

    【讨论】:

    • 当我使用你的代码时,我从 console.log(user) 返回的都是 null
    • 确保req.session.user.email 存在。例如。将console.log(req.session.user.email) 放在数据库查询上方一行以进行检查。实际上,将整个 mongoose 文档存储到会话中并不是一个好主意,因为它们将被 client-sessions 编码成一个 cookie 字符串。
    • 它没有被创建,但我不知道为什么。太令人沮丧了。我尝试只存储电子邮件而不是整个文档,它也不起作用。
    • 我想通了...这是两倍。一个问题是您指出的问题,另一个是我在上面添加到问题的答案中提到的这个问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2019-01-22
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2016-01-24
    相关资源
    最近更新 更多