Sails框架Socket请求返回响应时触发TypeError错误求助
解决Sails.js Socket控制器返回响应时崩溃的问题
看起来你碰到的这个TypeError: Right-hand side of 'instanceof' is not callable错误,根源大概率是依赖版本不兼容或者第三方Socket钩子与Sails内置功能冲突,下面给你一步步排查的思路:
先排查可疑的第三方钩子
从报错路径能看到sails-hook-sockets的身影,但其实Sails.js本身已经内置了完整的Socket.io支持,完全不需要额外安装这个钩子。这个第三方钩子很可能和Sails原生的Socket处理逻辑冲突,导致响应对象(res)被错误封装,进而在调用res.ok()/res.json()时触发has-binary库的错误。
建议先试试这个最直接的方案:
- 卸载
sails-hook-sockets:npm uninstall sails-hook-sockets - 重启Sails服务,再测试你的Socket请求,看是否还会崩溃。
如果必须使用该钩子,检查依赖版本兼容性
要是卸载钩子不可行,就重点排查版本匹配问题:
- 服务端与客户端Socket.io版本必须一致:你客户端用的是
socket.io-client,服务端的socket.io版本得和它完全匹配(比如同是2.x或同是3.x,跨大版本必然会有兼容性问题)。 - 更新或替换
has-binary模块:报错就来自这个模块的_hasBinary函数,旧版本的has-binary在高版本Node.js下会出现instanceof相关的兼容性错误。你可以:- 尝试更新它:
npm update has-binary - 如果更新无效,替换为维护更活跃的分支
has-binary2:npm uninstall has-binary && npm install has-binary2
- 尝试更新它:
- 检查Node.js版本:如果你的Node.js是10+版本,旧版
has-binary确实会出问题,建议升级到Node.js 14+版本(优先推荐),或者临时降级到Node.js 8(不推荐长期使用)。
验证控制器响应对象的合法性
你的控制器代码逻辑本身没问题,但可以加个小测试确认响应对象是否正常:
AddFolder: function(req, res) { if (req.isSocket) { sails.log("Test"); // 打印响应对象的类型信息,确认是否是Sails预期的对象 sails.log('响应对象类型:', typeof res); sails.log('是否为Sails响应实例:', res instanceof sails.hooks.http.res); return res.ok({message: '测试响应'}); } else { return res.badRequest(); } }
如果打印结果显示res不是预期的Sails响应实例,那基本可以确定是第三方钩子篡改了响应对象,还是建议移除它。
内容的提问来源于stack exchange,提问作者user933306
相关产品推荐
相关产品推荐

