SailsJS 1.4版本如何使用Socket?对接Nuxt.js连接失败如何解决
问题原因
- SailsJS 内置的 Socket 能力基于 Socket.io 封装实现,并未提供原生 WebSocket 服务支持。原生 WebSocket 握手请求要求服务端返回 101 状态码完成协议升级,而你直接用
new WebSocket()访问业务路由,该路由只会返回普通 JSON 响应,无法完成协议升级,必然触发连接失败。 - 路由配置中的
isSocket: true仅用于限制该路由仅允许 Socket 类请求访问,不会将该路由路径转换为 WebSocket 握手端点,Sails 的 Socket.io 服务默认握手路径为/socket.io/,和业务路由无关。
解决方案
第一步:Nuxt 项目安装适配版本的 Socket.io 客户端,Sails v1 内置的 Socket.io 版本为 2.x,需要安装对应大版本的客户端避免兼容问题:
npm install socket.io-client@2第二步:调整对接逻辑,先连接 Sails 的 Socket.io 根服务,连接成功后再调用对应业务接口,示例代码如下:
import io from 'socket.io-client' // 连接Sails Socket.io根服务 this.connection = io('ws://localhost:1337', { // 存在跨域问题时可补充以下配置 transports: ['websocket', 'polling'] }) // 监听连接成功事件 this.connection.on('connect', () => { // 调用业务接口获取socketId this.connection.get('/label/exampleaction', (result) => { console.log('返回的socketId为', result.socketid) }) })
- 可选检查项:如果仍存在连接问题,确认 Sails 项目
config/sockets.js中的allowOrigins配置已放开 Nuxt 服务的域名端口,避免跨域拦截。
现有代码可优化点:你的动作代码中
sails.sockets.getId(req);为无意义冗余调用,可以直接删除,不影响正常逻辑。
内容的提问来源于stack exchange,提问作者Gaurav Sharma
相关产品推荐
相关产品推荐

