Sails升级至1.5.7后io.socket.get请求出现401未授权问题求助
问题分析与解决方案:Sails 1.5.7中io.socket.get请求失败
问题背景
为修复GHSA-gpw9-fwm8-7rx7漏洞,将Sails从1.5.2升级到1.5.7后,io.socket.get("/api/v1/direc/get-token", {}, gotToken) 请求失败,但切回1.5.6可正常工作。已排查:控制器日志未打印但回调触发,且已升级sails-hook-sockets到2.0.4版本。依赖配置及Node.js v18.17.1见下方。
可能原因及排查/解决步骤
先抓具体错误信息
把回调函数改成带错误参数的形式,打印错误详情:function gotToken(err, response) { console.error('Socket请求错误:', err); console.log('响应内容:', response); } io.socket.get("/api/v1/direc/get-token", {}, gotToken);回调触发但没走到控制器,大概率是请求在中间件阶段被拦截,错误信息能直接定位问题。
核对Sails 1.5.7的socket相关变更
1.5.7针对socket请求可能做了安全或路由匹配的调整:- 检查是否新增了socket路径限制,比如默认socket命名空间变更,导致
/api/v1前缀的路由无法匹配; - 查看是否调整了socket中间件的执行顺序,比如认证中间件(passport)现在会拦截socket请求,而之前版本不会。
- 检查是否新增了socket路径限制,比如默认socket命名空间变更,导致
检查Sails socket配置
打开config/sockets.js(如果没有则新建),确认以下配置:module.exports.sockets = { allowUpgrades: true, transports: ['websocket', 'polling'], // 确认是否开启了正确的命名空间或路径匹配 prefix: '/socket.io', };若路由使用了前缀,需确保socket配置和路由前缀兼容。
排查第三方hook兼容性
sails-hook-sockets可能和Sails 1.5.7存在适配问题,尝试暂时移除该hook,改用Sails内置的socket.io支持(Sails原生集成socket.io,多数场景无需额外hook);- 检查其他hook(如
sails-hook-pino、passport)是否在socket请求到达控制器前拦截了请求,可临时禁用这些hook测试是否恢复正常,逐步排查。
最简项目验证
创建一个全新的Sails 1.5.7项目,只配置/api/v1/direc/get-token路由和对应的socket请求,测试是否能正常工作。如果正常,说明是现有项目中其他依赖或配置冲突导致的问题。
依赖配置参考
"dependencies": { "sails": "1.5.7", "sails-hook-apianalytics": "2.0.5", "sails-hook-organics": "2.2.0", "sails-hook-orm": "4.0.1", "sails-hook-pino": "1.1.2", "sails-hook-sockets": "2.0.4", "@sailshq/lodash": "3.10.4", "sails-postgresql": "4.0.0", "passport": "0.6.0", "@techpass/passport-openidconnect": "0.3.2", "connect-pg-simple": "7.0.0", "crypto": "1.0.1", "morgan": "1.10.0", "on-headers": "1.0.2", "twilio": "3.43.0", "@sentry/node": "7.0.0" }
内容的提问来源于stack exchange,提问作者Rachet
相关产品推荐
相关产品推荐

