express-mysql-session无法存储会话问题求助
问题排查与解决方案
1. 未初始化数据库连接
你的代码创建了MySQL连接对象,但没有主动建立连接,也未处理连接错误,这会导致会话存储无法和数据库通信。需要添加连接初始化和错误监听:
var connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'myBooks', socketPath: '/Applications/MAMP/tmp/mysql/mysql.sock' }); // 建立连接并处理错误 connection.connect((err) => { if (err) { console.error('数据库连接失败:', err); return; } console.log('已成功连接到MySQL'); }); connection.on('error', (err) => { console.error('数据库连接错误:', err); });
2. 跨数据库访问的潜在问题
你的连接默认指向myBooks库,虽然express-mysql-session配置了database: 'sessions-test',但更稳妥的方式是直接创建针对sessions-test的独立连接,避免跨库权限或切换问题:
// 专门用于会话存储的连接 var sessionConnection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'sessions-test', // 直接指向会话数据库 socketPath: '/Applications/MAMP/tmp/mysql/mysql.sock' }); sessionConnection.connect((err) => { if (err) { console.error('会话数据库连接失败:', err); return; } console.log('已成功连接到会话数据库'); }); const sessionStore = new mySQlStore({}, sessionConnection); // 无需再指定database
3. 触发会话存储逻辑
虽然设置了saveUninitialized: true,但部分场景下只有会话被修改时才会触发存储写入。可以在路由中主动修改会话来测试:
app.get('/', (req, res, next) => { // 主动修改会话,触发存储操作 req.session.visitedAt = new Date().toString(); res.send("<h1>Hello</h1>") })
4. 检查表结构匹配性
你手动创建的表结构是正确的,但需确认表名为sessions(模块默认表名),若自定义表名,需在mySQlStore配置中指定:
const sessionStore = new mySQlStore({ table: 'your_custom_table_name' // 仅当表名不是sessions时需要添加 }, sessionConnection);
修改后的完整代码示例
const express = require("express"); const mysql = require("mysql"); const session = require("express-session"); const mySQlStore = require("express-mysql-session")(session); const app = express(); // 会话数据库连接 var sessionConnection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'root', database: 'sessions-test', socketPath: '/Applications/MAMP/tmp/mysql/mysql.sock' }); sessionConnection.connect((err) => { if (err) { console.error('会话数据库连接失败:', err); return; } console.log('已成功连接到会话数据库'); }); sessionConnection.on('error', (err) => { console.error('会话数据库连接错误:', err); }); const sessionStore = new mySQlStore({}, sessionConnection); app.use(session({ key: 'session_cookie_name', secret: 'session_cookie_secret', name: 'my_cookie', store: sessionStore, resave: false, createDatabaseTable: false, saveUninitialized: true, cookie: { maxAge: 60000 } })); app.get('/', (req, res, next) => { // 修改会话触发存储 req.session.visitedAt = new Date().toISOString(); res.send("<h1>Hello</h1>") }) app.listen(3000, () => { console.log('服务器运行在http://localhost:3000'); });
完成以上修改后,访问localhost:3000,再检查sessions-test库的sessions表,即可看到会话数据。若仍有问题,可查看控制台错误日志,排查数据库权限、socket路径等细节问题。
内容的提问来源于stack exchange,提问作者Pearl Lin
相关产品推荐
相关产品推荐

