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

本地正常但Glitch部署后req.session.user为undefined求助

问题:Glitch部署后req.session.user丢失导致认证失败

本地环境中使用req.session.user控制登录状态正常,但部署到Glitch平台后,auth中间件里的req.session.user变为undefined,登录接口中已初始化该变量,但后续请求时丢失。

核心原因

  1. 默认内存会话存储不适合生产环境:express-session默认用内存存储会话,Glitch服务器会定期重启或运行在多实例模式,重启后内存中的会话会全部丢失。
  2. Cookie配置未适配HTTPS环境:Glitch强制使用HTTPS,而默认的Cookie配置未开启secure属性,浏览器会拒绝保存未标记为secure的Cookie,导致会话无法传递。
  3. 硬编码的secret存在风险:硬编码的secret如果在多实例环境中不一致,会导致会话签名验证失败,无法解析session数据。

解决方案

1. 替换会话存储为MongoDB持久化存储

安装connect-mongo依赖,将会话存储到已有的MongoDB数据库中,避免重启丢失:

npm install connect-mongo

修改server.js,引入并配置MongoStore:

// 顶部新增引入
const MongoStore = require('connect-mongo');

// 替换原有的session配置
app.use(session({
    secret: process.env.SESSION_SECRET || 'fallback-secret', // 从环境变量读取secret,本地用 fallback
    resave: false,
    saveUninitialized: false, // 禁止创建空会话,更安全
    store: MongoStore.create({
        mongoUrl: process.env.MONGODB_URI, // 复用已有的MongoDB连接字符串
        ttl: 14 * 24 * 60 * 60 // 会话有效期14天
    }),
    cookie: {
        secure: process.env.NODE_ENV === 'production', // 生产环境(Glitch)启用secure
        sameSite: 'lax', // 适配现代浏览器Cookie政策
        maxAge: 14 * 24 * 60 * 60 * 1000 // Cookie有效期与会话一致
    }
}));

2. 在Glitch中配置环境变量

在Glitch项目的.env文件中添加SESSION_SECRET(随机生成一个复杂字符串):

SESSION_SECRET=your-random-complex-secret-here

3. 确保会话保存后再响应

在登录和注册接口中,手动调用req.session.save()确保会话持久化后再重定向/返回响应:

登录接口修改:

app.post('/api/login', async (req, res) => {
    const { username, password } = req.body
    const user = await User.findOne({ username }).lean()
    if (!user) {
        return res.render(path.join(__dirname, 'views', 'error.ejs'), {error : "Incorrect username or password", redirect : "/login"});
    } else if (await bcrypt.compare(password, user.password)){
        req.session.user = {username : username, isAdmin : user.isAdmin};
        // 手动保存会话后再重定向
        req.session.save(err => {
            if (err) console.error('Session save error:', err);
            res.redirect("/home");
        });
    }
    else {
        return res.render(path.join(__dirname, 'views', 'error.ejs'), {error : "Incorrect username or password", redirect : "/login"});
    }
});

注册接口修改:

app.post('/api/register', async (req, res) => {
    // ... 原有代码省略 ...
    else{
        const password = await bcrypt.hash(plainTextPassword, 10);
        const user = new User({ username, password, isAdmin : false });
        await user.save();
        req.session.user = {username : username, isAdmin : false};
        // 手动保存会话后再返回响应
        req.session.save(err => {
            if (err) console.error('Session save error:', err);
            res.json({ status: 'ok' });
            console.log('Utilisateur créé : ', req.session.user);
        });
    }
});

4. 完善MongoDB连接状态监听

添加连接成功/失败的日志,方便排查问题:

mongoose.connect(process.env.MONGODB_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true
}).then(() => {
    console.log("MongoDB connected successfully");
}).catch(err => {
    console.error("MongoDB connection error:", err);
});

验证步骤

  1. 重启Glitch项目,确保依赖安装完成
  2. 登录后访问需要认证的路由(如/home),检查req.session.user是否存在
  3. 重启Glitch服务器,再次访问认证路由,确认会话不会丢失

内容的提问来源于stack exchange,提问作者willinho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:02:44