You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Passport.js时无法访问req.user.username的问题求助

解决Passport.js中req.user仅返回ID无法获取username的问题

问题出在你的passport.deserializeUser配置上:你在查询到用户后,只把user.id传递给了done回调,而不是完整的用户对象。这会导致会话中仅存储用户ID,后续请求的req.user自然就只有ID,无法访问username等其他字段。

修改后的Passport配置(重点修改deserializeUser)

const passport = require('passport')
const GoogleStrategy = require('passport-google-oauth20')
const User = require('../models/User')
 
passport.serializeUser((user, done) => {
    done(null, user.id) // 这里逻辑正常,仅将用户ID存入会话
})

// 修正此处:传递完整的user对象,而非仅user.id
passport.deserializeUser((id, done) => {
    User.findById(id).then((user) => {
        done(null, user) 
    })
})

passport.use(
    new GoogleStrategy({
    callbackURL: '/auth/google/redirect',
    clientID: process.env.clientID,
    clientSecret: process.env.clientSecret
}, (accessToken, refreshToken, profile, done) => {
    User.findOne({googleId:profile.id}).then((currentUser) => {
        if(currentUser){
            console.log('user is: ' + currentUser)
            done(null, currentUser)
        } else {
            new User({
                username: profile.displayName,
                googleId: profile.id
            }).save().then((newUser) => {
                console.log('new user created' + newUser)
                done(null, newUser)
            })
        }
    })
}))

修正后验证

修改完成后,访问个人资料页面时,req.user会是完整的用户对象,你可以正常访问req.user.username。

另外补充:你的登出路由尚未实现完整逻辑,建议添加Passport官方的登出处理:

router.get('/logout', (req, res) => {
    req.logout((err) => {
        if (err) { return next(err); }
        res.redirect('/login');
    });
})

内容的提问来源于stack exchange,提问作者fowwest74

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:05:30