Passport认证后博客模块中req.user返回undefined的问题求助
问题根源:会话中间件的作用范围不对
嘿,我一眼就瞅出问题啦!你把Cookie解析、Session管理和Passport初始化的核心中间件都只挂载在了/users路由下面,这就导致/blogs路由完全没经过这些中间件的处理,自然没法获取到req.user啦~
为啥会这样?
Express的中间件是按挂载顺序生效的:只有在路由之前加载,或者和路由同层级/父层级加载的中间件,才能被该路由的请求使用。你之前把会话相关的中间件只放在users.js里,相当于只有访问/users/*的请求才会走这些逻辑,/blogs的请求根本碰不到它们,会话信息(包括req.user)自然没被初始化。
修复步骤
1. 把核心中间件移到app.js全局加载
修改app.js,把会话和Passport相关的中间件放在全局,让所有路由都能共享:
const express = require('express'); const app = express(); const path = require('path'); const bodyParser = require('body-parser'); const cookieParser = require('cookie-parser'); const session = require('express-session'); const passport = require('passport'); const models = require('./models'); const User = models.users; // 先加载解析类中间件 app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); app.use(cookieParser()); // 加载Session中间件(必须在Passport之前) app.use(session({ secret: 'keyboard cat', resave: false, saveUninitialized: true })); // 初始化Passport app.use(passport.initialize()); app.use(passport.session()); // 配置Passport策略 require('./config/passport.js')(passport, User); // 挂载路由 const Users = require("./routes/Users"); const Blogs = require("./routes/Blog"); app.use("/users", Users); app.use("/blogs", Blogs); // 视图配置 app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.listen(3000, function() { console.log('Server started...'); });
2. 清理users.js里的重复中间件
现在全局已经加载了这些中间件,users.js里就不需要重复加载了,修改后的代码如下:
const passport = require('passport'); const express = require('express'); const users = express.Router(); const models = require('../models'); const User = models.users; // 移除所有cookieParser、session、passport的use代码(全局已处理) // 原有路由逻辑保持不变 users.post('/register', passport.authenticate('local-register', { successRedirect: '/users/profile', failureRedirect: '/users/register' })); users.post('/login', passport.authenticate('local-login', { session: true, successRedirect: '/users/profile', failureRedirect: '/users/profile' })); module.exports = users;
3. 验证效果
重启服务器,登录后访问/blogs,你会发现console.log(req.user)已经能正常输出当前登录用户的信息啦!
额外小提示
- 中间件加载顺序很关键:
cookieParser必须在express-session之前,express-session必须在Passport初始化中间件之前。 - 如果需要保护博客路由,还可以写个权限校验中间件:
function isLoggedIn(req, res, next) { if (req.isAuthenticated()) return next(); res.redirect('/users/login'); }
然后在博客路由里使用:
blogs.get('/', isLoggedIn, (req,res) =>{ console.log(req.user) // 稳稳拿到用户信息 res.send('Blog List'); });
内容的提问来源于stack exchange,提问作者ArK
相关产品推荐
相关产品推荐

