Socket.io 客户端:始终无效的命名空间消息

问题描述 投票:0回答:1

服务器代码:

import http from 'http';
import Koa from 'koa';
import { Server } from 'socket.io';


(async () => {
  const app = new Koa();
  var server = http.createServer(app.callback());
  var io = new Server(server, {
    path: '/seacher',
    transports: ['websocket'],
  });

  io.on('connection', (socket) => {
    setTimeout(() => socket.emit('message', { say: 'hello' }), 1000);

    socket.on('message', (msg) => {
      console.log('[msg]', msg);
    });
  });

  server.listen(3000)
})();

客户端代码:

var socket = io('http://localhost:3000/seacher', {
  path: '/seacher',
  autoConnect: false,
  transports: ['websocket'],
});
socket.on('error', (err) => console.log('error', err));
socket.on('connect', () => console.log('connect'));
socket.connect();

浏览器/nodejs控制台中没有任何消息。

在浏览器的“网络”选项卡中,有很多带有消息的连接,例如

node.js typescript socket.io koa
1个回答
20
投票

将客户端代码更改为:

const socket = io('http://localhost:3000', {     // note changed URL here
  path: '/seacher',
  autoConnect: false,
  transports: ['websocket'],
});

path
选项指定socket.io将在内部使用的URL。您将其放入
path
选项中,就像您在客户端和服务器中所做的那样。

如果您在指定的 URL 中添加了某些内容,就像您已

'http://localhost:3000/seacher'
那样,那么这就是您尝试连接的命名空间
/seacher
,但您的服务器不支持该命名空间。

这是socket.io设计中令人困惑的部分,但在socket.io中路径和命名空间并不是一回事。不要混淆或混合它们。


仅供参考,很少有理由像您所做的那样自定义

path

 选项,除非您尝试运行在同一 http 服务器上共享的多个 socket.io 服务器(您似乎没有这样做)。默认情况下,路径是 
/socket.io
,这在日志和调试器以及访问客户端库时很有意义。我建议您从客户端和服务器中删除 
path
 选项,并让它默认为 
/socket.io
。并且,也不要在连接 URL 中使用路径,因为它指定命名空间,而不是路径。

© www.soinside.com 2019 - 2024. All rights reserved.