Sails.js使用Redis会话适配器设置会话报错:无法为undefined赋值'user_data'
解决Sails.js中Redis会话适配器下req.session为undefined的问题
看来你在配置Sails.js的Redis会话时碰到了req.session未定义的坑,我来帮你梳理几个关键排查点和解决步骤:
1. 确认依赖包是否安装完整
仅仅在config/session.js里指定adapter: 'connect-redis'还不够,你需要同时安装connect-redis适配器和底层的redis驱动包。在项目根目录执行:
npm install connect-redis redis --save
2. 完善Redis会话的完整配置
你的config/session.js配置太简略了,Redis适配器需要更多连接参数才能正常工作。参考下面的示例补充配置:
module.exports.session = { secret: 'your-own-super-secret-key-here', // 必须设置,用于加密会话内容 adapter: 'connect-redis', // 可以用url统一配置,也可以分开写host/port/password url: 'redis://localhost:6379', host: 'localhost', port: 6379, password: '', // 如果你的Redis设置了密码,这里填写对应值 ttl: 86400, // 会话过期时间,单位秒,比如设置为1天 prefix: 'sails-session:', // Redis键的前缀,避免和其他应用的键冲突 saveUninitialized: false, // 避免保存未初始化的空会话 resave: false // 避免重复保存未修改的会话 };
3. 检查会话中间件的加载顺序
在config/http.js里,要确保session中间件在router之前加载——只有这样,当请求到达你的登录控制器时,req.session才会被正确初始化。默认配置一般没问题,但如果你自定义过中间件顺序,一定要确认:
module.exports.http = { middleware: { order: [ 'cookieParser', 'session', // 这个必须在router之前 'bodyParser', 'router', 'www', 'favicon' ] } };
4. 验证Redis服务是否正常运行
如果Redis服务没启动,或者Sails应用连不上Redis,会话系统会直接失效。打开终端执行:
redis-cli ping
如果返回PONG,说明Redis服务正常;如果报错,先启动Redis服务,再重启Sails应用。
5. 确认代码执行的上下文
你设置req.session.user_data的代码,必须在Sails的控制器动作或者经过会话中间件的路由处理函数里。如果是在独立脚本、定时器任务,或者没经过会话中间件的自定义路由里执行,req.session肯定是undefined。
临时测试用Workaround(不推荐长期使用)
如果以上排查都没问题但仍报错,可以尝试在设置会话数据前手动初始化会话对象:
// 仅作为临时测试,建议找到根本原因后移除 if (!req.session) { req.session = {}; } req.session.user_data = { user_id : userInfo.id, role_id : userInfo.role_id.id, token : token };
内容的提问来源于stack exchange,提问作者Sanjay Kumar N S
相关产品推荐
相关产品推荐

