[英]req.session undefined in route
我正在用expressjs和passportjs構建一個簡單的站點,我遇到的問題是我無法訪問路由中的會話變量。
這個主題有很多線程,但解決方案對我不起作用。 看起來我的錯誤在其他地方。
我的應用程序配置如下:
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.