簡體   English   中英

req.session在路線中未定義

[英]req.session undefined in route

我正在用expressjspassportjs構建一個簡單的站點,我遇到的問題是我無法訪問路由中的會話變量。

這個主題有很多線程,但解決方案對我不起作用。 看起來我的錯誤在其他地方。

我的應用程序配置如下:

app.configure(function() {
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.logger());
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.session({
        path: '/',
        secret: 'very secret'
    }));

    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
    app.use(express.static(__dirname + '/public'));
});

一旦護照驗證了Twitter帳戶,它就被重定向到這個網站:

app.get('/auth/twitter/callback',
    passport.authenticate('twitter', {
        failureRedirect: '/login'
    }),
    function(req, res) {
        res.redirect('/');
        console.log("populate session")
        populateSession(req, res);
    });

這是有效的,因為我在登錄時看到控制台中的“填充會話”輸出。

populateSession()看起來像這樣:

function populateSession(req, res) {
    User.findOne({
        twitterID: req.user.id
    }, function(err, result) {
        if (result) {
            // Store data to session
            req.session.twitterAccessToken = result.twitterAccessToken;
            req.session.twitterAccessTokenSecret = result.twitterAccessTokenSecret;
            req.session.lastfmAccountName = result.lastfmAccountName;

            console.log("in session: " + req.session.lastfmAccountName)
        }
    })
}

“會議中”以正確的方式打印。 因此會話本身有效。 現在我的問題是我想要訪問路由中的會話變量,因為我想將它們傳遞給我的視圖模板,如下所示:

app.get('/account', ensureAuthenticated, function(req, res) {
    console.log(req.session)
    console.log("lastfm nick " + req.session.lastfmAccountName)
    res.render('account', {
        user: req.user,
        lastfmnick: req.session.lastfmAccountName
    });

這就是我遇到問題的地方。 req.session包含護照填充的所有twitter字段,但req.session.lastfmAccountName undefined

知道那里有什么問題,或者有更好的方法將變量傳遞給視圖? 如果它可以存儲在會話中,我覺得對所有路由中的字段進行數據庫查詢並不是一個好主意。

謝謝!

會話將在響應結束時自動保存 ,在本例中為res.redirect() ,這是在對會話進行修改之前完成的。

function(req, res) {
    res.redirect('/');         // ends the response, saving the session

    populateSession(req, res); // modifies the session without saving
});

由於.findOne()是異步的,如果修改populateSession()以在查找完成時接受並調用回調,則可以控制順序以便首先修改會話:

function populateSession(req, res, next) {
    User.findOne({
        twitterID: req.user.id
    }, function(err, result) {
        if (result) {
            // ...
        }

        if (next) next(err);
    })
}
app.get('/auth/twitter/callback',
    /* ... */,
    function(req, res) {
        populateSession(req, res, function () {
            res.redirect('/');
        });
    });

它還允許您使用populateSession作為中間件:

app.get('/auth/twitter/callback',
    /* ... */,
    populateSession,
    function(req, res) {
        res.redirect('/');
    });
 app.use(lib.express.cookieParser(lib.config.cookieSecret));
 app.use(lib.express.session({
secret: 'very secret'
 })
 }));

這兩行應該是連續的並按此順序排列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM