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
相关产品推荐
相关产品推荐

