我是nodejs
的新手,所以我试图建立一个身份验证系统。我按照教程后实现了它。
要在进行身份验证时获取用户对象,您需要将其存储在会话中。我是通过配置express-session
完成的,如下所示:
require('./config/passport')(passport); // pass passport for configuration
app.use(session({
secret: 'thisisagreatgreatsecretforthesession',
resave: true,
saveUninitialized: true
}));
app.use(morgan('dev'));
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended : false }));
app.use(bodyParser.json());
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
app.use(function(req, res, next) {
res.locals.user = req.user;
next();
});
var routes = require('./app/routes')(app, passport);
然后在护照中我配置了序列化和反序列化函数,如下所示:
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
我尝试在deserializeUser
功能中安装用户,这是正确的。但是,当我在模板中调用user
时,出现错误,指出用户未定义。
我在配置中遗漏了其他内容吗?
答案 0 :(得分:0)
默认情况下,会话属性不会公开给模板。
如果您想从模板中访问req.user
,可以使用一个简单的Express中间件来公开它:
app.use(function(req, res, next) {
res.locals.user = req.user;
next();
});
(确保在 session
和Passport中间件之后添加此中间件,但之前添加了呈现访问user
的模板的任何路由 ;使用Express,您声明中间件的顺序很重要)
这使用res.locals
作为向所有模板公开数据的方法。实际上,如果你查看Express文档,它几乎显示了与如何公开用户数据的示例完全相同的代码。