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

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两个会话中间件,而且加载顺序完全搞反了,具体原因和修复方案如下:

问题原因拆解

  1. express-session会给req.session对象添加一系列方法(包括touch),但你在加载完express-session之后,又加载了cookie-session——后者会直接覆盖整个req.session对象,把express-session添加的方法全部清空。
  2. Passport在处理OAuth2回调时,会依赖会话对象的touch方法来更新会话有效期,但此时req.session已经被cookie-session替换,自然找不到这个方法了。
  3. 另外,你根本不需要同时用这两个会话中间件,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:37:40