有时对每个请求执行查询以获取经过身份验证的用户数据并不是一个好的做法(但它通常在应用程序中使用)。
在我的一个应用程序中,我只需要id
经过身份验证的用户而不是所有数据(例如password
,last_login_date
,register_date
,...)所以我改变了passport
配置如下:
passport.serializeUser(function(user, done) {
done(null, {id: user.id});
});
// used to deserialize the user
passport.deserializeUser(function(object, done) {
done(null, object); // object is: {id: user_id}
});
然后在你的控制器中你可以从会话中获取用户ID:
router.get('/', function(req, res, next)=> {
const userId = req.user.id;
// now do a database query only if needed :)
});
您还可以定义一个自定义中间件来从数据库获取用户并设置为req.user
在下一个中间件中使用:
function fetchUser (req, res, next) {
db.User.find({ where: {id:req.user.id} }).success(function(user){
req.user = user;
next(); // will trigger next middleware
}).error(function(err){
next(err); // will trigger error handler
});
}
router.get('/', fetchUser, function(req, res, next)=> {
const user = req.user;
// now user is a object that is fetched from db and has all properties
});
在这种方法中,您将仅在需要时执行从数据库检索用户的查询,而不是针对所有路由。