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

Cookie-session仅在存储数据的路由内生效的问题求助

问题:Express中使用cookie-session存储用户信息后跨路由无法访问

在基于Express开发的项目中,需要将登录路由的特定字段存入后端session,以便在不同路由中调用,但使用cookie-session时,存储session的路由之外无法访问该数据,出现如下错误:

错误信息

Error fetching tickets: TypeError: Cannot read properties of undefined (reading 'username')
    at C:\Users\charlie\Desktop\ARP-Website\server\routes\ticketsystem.js:14:67
    at Layer.handle [as handle_request] (C:\Users\charlie\Desktop\ARP-Website\server\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\charlie\Desktop\ARP-Website\server\node_modules\express\lib\router\route.js:149:13)
    at Route.dispatch (C:\Users\charlie\Desktop\ARP-Website\server\node_modules\express\lib\router\route.js:119:3)
    at Layer.handle [as handle_request] (C:\Users\charlie\Desktop\ARP-Website\server\node_modules\express\lib\router\layer.js:95:5)
    at C:\Users\charlie\Desktop\ARP-Website\server\node_modules\express\lib\router\index.js:284:15
    at Function.process_params (C:\Users\charlie\Desktop\ARP-Website\server\node_modules\express\lib\router\index.js:346:12)
    at next (C:\Users\charlie\Desktop\ARP-Website\server\node_modules\express\lib\router\index.js:280:10)
    at Function.handle (C:\Users\charlie\Desktop\ARP-Website\server\node_modules\express\lib\router\index.js:175:3)
    at router (C:\Users\charlie\Desktop\ARP-Website\server\node_modules\express\lib\router\index.js:47:12)

相关代码

app.js

// app.js
const express = require('express');
const cors = require('cors');
const session = require('cookie-session');
require('dotenv').config();

const app = express();
const port = process.env.PORT || 5000;

// Import MongoDB client
const client = require('./dbClient');

app.use(session({
  name: 'session',
  keys: [process.env.SESSION_SECRET],
}));

auth.js(登录路由)

// Login route
router.post('/login', async (req, res) => {
  const { usernameoremail, password } = req.body;

  try {
    const usersCollection = client.db('DB').collection('users');
    const user = await usersCollection.findOne({
      $or: [{ username: usernameoremail }, { email: usernameoremail }]
    });

    if (!user) {
      return res.status(401).json({ message: 'Invalid credentials' });
    }

    const isMatch = await bcrypt.compare(password, user.password);

    if (!isMatch) {
      return res.status(401).json({ message: 'Invalid credentials' });
    }

    const token = jwt.sign(
      { userId: user._id, username: user.username, email: user.email, role: user.role },
      process.env.JWT_SECRET,
      { expiresIn: '1h' }
    );

    // Store in cookie-session
    req.session.user = {
      username: user.username,
      email: user.email,
      role: user.role,
    };
});

ticketsystem.js

const express = require('express');
const router = express.Router();

// Import MongoDB client
const client = require('../dbClient');

const ticketsCollection = client.db('DB').collection('tickets');

// get user tickets
router.get('/tickets', async (req, res) => {
    try {
        const user = req.session.user;
        
        const tickets = await ticketsCollection.find({ user: user.username }).toArray();

        res.json(tickets);
    } catch (error) {
        console.error('Error fetching tickets:', error);
        res.status(500).json({ error: 'Internal server error' });
    }
});

module.exports = router;

注:注册路由逻辑与登录路由一致。

已尝试的解决方案

  • 更换express-session、cookie parser等库
  • 尝试多种middleware配置
  • 确保session middleware在所有路由之前加载

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:34:50