使用passport.js配置cookie-session时遇.regenerate is not a function错误求助
1. Passport.js是否兼容cookie-session?
完全兼容。你遇到的报错并非来自两者的兼容性问题,而是中间件加载顺序错误,加上cookie-session提供的req.session对象默认没有Passport.js在deserializeUser流程中调用的regenerate方法导致的。
2. 配置修复步骤
步骤1:调整中间件加载顺序
Passport的会话中间件(passport.session())必须依赖会话存储中间件(这里是cookie-session)先初始化好req.session,所以必须把cookie-session的加载放在passport.initialize()和passport.session()之前。
步骤2:给req.session补全regenerate方法
cookie-session本身没有实现regenerate方法,但我们可以手动补上这个方法,让Passport.js能正常调用。
修复后的完整代码
import express from 'express'; import dotenv from 'dotenv'; import mongoose from 'mongoose'; import cors from 'cors'; import router from '../../routes/auth-routes.js' import passport from 'passport'; import sessionCookie from 'cookie-session'; import '../../config/passport-setup.js'; dotenv.config(); const app = express(); const PORT = process.env.APP_PORT; const DB_URL = process.env.APP_URL; const SECRET = process.env.SECRET; // 基础中间件 app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use(cors()); app.set("view engine", "ejs"); // 1. 先加载cookie-session中间件 app.use(sessionCookie({ maxAge: 24 * 60 * 60 * 1000, keys: [SECRET] })) // 2. 给req.session添加regenerate方法,适配Passport的调用需求 app.use((req, res, next) => { if (!req.session.regenerate) { req.session.regenerate = (cb) => { req.session = {}; cb(); }; } next(); }); // 3. 再加载Passport相关中间件 app.use(passport.initialize()); app.use(passport.session()); // 最后挂载路由 app.use('/auth', router); mongoose.connect(DB_URL) .then(() => { console.log("mongoDb connected!"); app.listen(PORT, () => console.log("listening to port " + PORT)) }).catch((err) => { console.log(err.message) });
补充说明
- 手动实现的
regenerate逻辑是重置会话对象为空,完全能满足Passport清空旧会话、创建新会话的需求。 - 确保
cookie-session的keys配置使用高强度的安全密钥,防止会话内容被篡改。
内容的提问来源于stack exchange,提问作者Scott Boragay
相关产品推荐
相关产品推荐

