Express集成PassportJS实现登录时抛出TypeError: req.session.touch is not a function错误
解决Express+PassportJS中
req.session.touch不是函数的错误 我来帮你搞定这个问题!你碰到的TypeError: req.session.touch is not a function错误,根源出在同时混用了cookie-session和express-session两个会话中间件,而且加载顺序完全搞反了,具体原因和修复方案如下:
问题原因拆解
express-session会给req.session对象添加一系列方法(包括touch),但你在加载完express-session之后,又加载了cookie-session——后者会直接覆盖整个req.session对象,把express-session添加的方法全部清空。- Passport在处理OAuth2回调时,会依赖会话对象的
touch方法来更新会话有效期,但此时req.session已经被cookie-session替换,自然找不到这个方法了。 - 另外,你根本不需要同时用这两个会话中间件,Passport支持多种会话存储方案,选其中一个就行。
修复步骤
1. 移除冗余的express-session依赖
删掉代码中关于express-session的所有引用,包括:
const express_session = require("express-session"); // ... app.use(express_session({ secret: 'SECRET' }));
2. 调整中间件加载顺序
确保cookie-session在passport.initialize()和passport.session()之前加载,这样Passport才能拿到正确的会话对象。
3. 修正后的完整代码
const express = require("express"); const morgan = require("morgan"); const helmet = require("helmet"); const multer = require("multer"); const cors = require("cors"); const bodyParser = require("body-parser"); require("dotenv").config(); const cookieSession = require("cookie-session"); const cookieParser = require('cookie-parser'); const middlewares = require("./middlewares"); const passport = require("passport"); const passportSetup = require("./passport"); //Defining routes to the exact file where handling code is located... const userRoute = require("./routes/users2"); const authRoute = require("./routes/auth3"); const projectRoute = require("./routes/projects2"); const storiesRoute = require("./routes/stories2"); const functions = require("firebase-functions"); const admin = require("firebase-admin"); const app = express(); // 先加载会话相关中间件 app.use(cookieParser()); app.use( cookieSession({ name: "session", keys: [process.env.COOKIET_KEY_1, process.env.COOKIET_KEY_2], maxAge: 24 * 60 * 60 * 1000 // 修正:原数值少打一个0,现在是正确的24小时有效期 }) ); // 然后加载Passport中间件 app.use(passport.initialize()); app.use(passport.session()); // 其他通用中间件 app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use(morgan("dev")); app.use(helmet()); app.use( cors({ origin: "http://localhost:3000", methods: "GET,POST,PUT,DELETE", credentials: true, }) ); app.use(express.json()); const router = express.Router(); const path = require("path"); // 路由配置 app.use("/auth", authRoute); app.use("/api/auth", authRoute); app.use("/api/users", userRoute); app.use("/api/projects", projectRoute); app.use("/api/stories", storiesRoute); exports.app = functions.https.onRequest(app); app.listen(8800, () => { console.log("Backend server is running!"); });
额外注意点
- 我帮你修正了
cookieSession的maxAge值:原来的24 * 60 * 60 * 100少了一个0,实际只有1/10天,现在改成24 * 60 * 60 * 1000才是正确的24小时有效期。 - 如果之前出现“需要express-session”的提示,大概率是你对Passport的误解——Passport并不强制依赖
express-session,只要有能提供req.session的会话中间件(比如cookie-session)就可以正常工作。
内容的提问来源于stack exchange,提问作者pratim
相关产品推荐
相关产品推荐

