nodejs:身份验证期间"req.session.save is not a function"错误



我正在使用PassportJS对应用程序中的用户进行身份验证。用户登录后,会创建会话,但在重定向后不久,会话似乎再次变得未定义,因为它尚未保存。我在网上发现,在重定向的情况下,重定向通常在会话保存之前完成,因此就好像从未进行过身份验证一样。显而易见的解决方案是使用req.session.save函数,这样重定向只会在会话保存后发生。但是,我收到一个错误日志"TypeError:req.session.save不是函数"。有人能帮忙吗?

这是我的app.js.代码

var express = require('express'),
passport = require('passport'),
session = require('express-session'),
bodyParser = require('body-parser'),
RedisStore = require('connect-redis')(session),
redis = require('redis'),
logger = require('morgan'),
errorHandler = require('express-error-handler'),
site = require('./site'),
oauth2 = require('./oauth2'),
port = process.env.PORT || 8080;
var app = express();
var redisClient = redis.createClient(8080, 'localhost');
// use sessions for tracking logins
app.use(session({
secret: 'keyboard cat',
resave: true,
saveUninitialized: true,
store: new RedisStore({
client: redisClient,
host: "pub-redis-14280.us-central1-1-1.gce.garantiadata.com",
port: 12543,
ttl: 260
})
}));
app.use(logger('dev'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json({ type: 'application/json' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(errorHandler({ dumpExceptions: true, showStack: true }));
// use ejs as file extension for views
app.set('view engine', 'ejs');
app.use(express.static(__dirname + '/views'));
// use passport
require('./auth');
// Account linking
app.get('/', site.index);
app.get('/login', site.loginForm);
app.post('/login', site.login);
app.get('/logout', site.logout);
app.get('/authorize', oauth2.authorization);
app.post('/authorize/decision', oauth2.decision);
// set up local server
if (module === require.main) {
// [START server]
// Start the server
var server = app.listen(process.env.PORT || 8080, function () {
var port = server.address().port;
console.log('App listening on port %s', port);
});
// [END server]
}
module.exports = app;

site.js:

var passport = require('passport');
var login = require('connect-ensure-login');
// get layout
exports.index = function (req, res) {
console.log("layout loaded");
res.render('layout');
}
// get login form
exports.loginForm = function (req, res) {
console.log("login page loaded");
res.render('login');
}
// post login form
exports.login = [
passport.authenticate('local'),
function (req, res) {
req.session.save(function (err) {
res.redirect('/');
});
}
]
// logout
exports.logout = function (req, res) {
req.logout();
res.redirect('/');
}

Passport序列化/反序列化用户:

passport.serializeUser(function(id, done) {
console.log("serializing user");
done(null, id);
});
passport.deserializeUser(function(id, done) {
console.log("deserializing user");
done(null, id);
});

在我的护照身份验证中,为了简单起见,我会返回用户id,因为这就是我在系统中代表用户所需要的全部内容。

如果其他人(像我一样(仍然有这个问题,请尝试遵循Nathan上面的评论,并调试与redis/mongo/etc商店的连接。

对我来说有效的是,我把redis主机设置为http://localhost,所以我把它换成了127.0.0.1(当然是本地开发(,一切都很好。

相关内容

最新更新