Express会话认证和分配变量

时间:2019-09-10 23:00:07

标签: node.js authentication express-session nedb

我面临着严峻的问题。我相信这对有经验的人来说非常简单。

在Node.js + Express + NeDB上创建本地Web服务器

登录时的客户端以/login的形式发出POST请求,并在成功登录后被重定向。 {"id":1,"created":1568146217901,"username":"sprice","name":"Steve Price","email":"email@gmail.com","password":"Password","level":"1","_id":"3JDE7p6tAl1vD11k"} 登录帖子

// POST services
app.post('/login', (req, res) => {
    const loginData = req.body;
    db.users.findOne({ username: loginData.uname }, function (err, doc) {
        req.session.userId = doc.id;
        if(doc.id === 1) console.log("True"); // < Output: True
        console.log(req.session.userId); // < Output: 1
    });
    req.session.userId = 1; // < Just for test
    res.redirect('/plan');
});

进入/plan页面之前,先进行一次身份验证检查:

const redirectLogin = (req, res, next) => {
    const { userId } = req.session;
    console.log(userId); // < Output: undefined
    if (!userId) {
        res.render('pages/index');
    } else {
        next()
    }
}

所以我提出了一个棘手的问题,如果我从DB中分配一个整数,并测试if语句是否得到req.session.userId = 1,但是当客户端被重定向到其req.session.userId = undefined时,我就进行测试。 但是,如果我在该测试行中手动分配值,则它可以正常工作,并且服务器发出Cookie,并且我可以毫无问题地访问我的网站... 我做错什么了吗?

1 个答案:

答案 0 :(得分:0)

您丢失了以下事实:对.findOne()的回调是 异步 non-blocking >。这意味着您的请求处理程序将先返回,然后再返回,然后在某个时间(已发送res.redirect()之后)调用回调。因此,回调对于重定向来说为时已晚。相反,您需要在回调中执行res.redirect()

// POST services
app.post('/login', (req, res) => {
    const loginData = req.body;
    db.users.findOne({ username: loginData.uname }, function (err, doc) {
        if (err) {
            console.log(err);
            res.sendStatus(500);
            return;
        }
        req.session.userId = doc.id;
        if(doc.id === 1) console.log("True"); // < Output: True
        console.log(req.session.userId); // < Output: 1
        res.redirect('/plan');
    });
});

根据您使用的会话存储,您可能还必须在重定向之前保存对会话的所有更改。