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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:34:55