在passport.js或session中的某处添加用户对象中的额外信息

我想在来自mongodb的用户对象中添加自定义键,这将被passport.js使用,但是我想知道为什么我不能将更多的键添加到该对象中,这里是我的代码。

passport.use(new LocalStrategy( function(username, password, done) { Users.model(false).findOne( {email:username,password:encodePassword(password) }, function(err, user) { if( err ){ // validation failed console.log('Error Occurred'); return done(err); } else if(user != null){ user['customKey'] = "customValue"; // it is not setting console.log(user); return done(null, user); } else { return done(null, false, { message: 'Incorrect username.' }); } }); } )); ///Session handling passport.serializeUser(function(user, done) { done(null, user.id); }); passport.deserializeUser(function(id, done) { Users.model(false).findById(id, function(err, user) { done(err, user); }); }); 

       

网上收集的解决方案 "在passport.js或session中的某处添加用户对象中的额外信息"

看到另一个问题的答案:

在反序列化函数中,在返回用户之前

 passport.deserializeUser(function(id, done) { getUser(id).then(function(user) { user.whatever = 'you like'; return done(null, user); }); }); 

或者在一个快速的中间件(在路由器之前)。

 app.use(function(req, res, next) { if(req.user) req.user.whatever = 'you like'; next(); }); 

如果您有多个提供者login并且想要向用户对象添加dynamic值。

 var customKey = null; //Store user id in session passport.deserializeUser(function (Id, done) { User.findById(Id, function (err, user) { var newUser = user.toObject(); newUser['customKey'] = customKey; done(err, newUser); }); }); //Local login passport.use('local.login', new LocalStrategy({ .... customKey = "isLocal"; .... // Facebook login passport.use('facebook.login', new LocalStrategy({ .... customKey = "isFacebook"; .... 

在路由器中访问:

 req.user.customKey; 

在模板中使用:

 // in app.js app.use(function(req, res, next) { res.locals.user = req.user; next(); }); //In hbs template: {{user.customKey}} 

希望能帮助你。