You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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请求,看是否还会崩溃。

如果必须使用该钩子,检查依赖版本兼容性

要是卸载钩子不可行,就重点排查版本匹配问题:

  1. 服务端与客户端Socket.io版本必须一致:你客户端用的是socket.io-client,服务端的socket.io版本得和它完全匹配(比如同是2.x或同是3.x,跨大版本必然会有兼容性问题)。
  2. 更新或替换has-binary模块:报错就来自这个模块的_hasBinary函数,旧版本的has-binary在高版本Node.js下会出现instanceof相关的兼容性错误。你可以:
    • 尝试更新它:npm update has-binary
    • 如果更新无效,替换为维护更活跃的分支has-binary2:npm uninstall has-binary && npm install has-binary2
  3. 检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:36:02