node.js - Socket.io 客户端:总是无效的命名空间消息
问题描述
服务器代码:
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 控制台中没有任何消息。
在浏览器的“网络”选项卡中,有很多带有消息的连接,例如
解决方案
将客户端代码更改为:
var 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 中使用路径,因为它指定了命名空间,而不是路径。
推荐阅读
- coldfusion - 无法通过 ColdFusion 在浏览器中禁用 HttpOnly 标志
- python - 检查一列中的每个值与一个数据框中其他列的每个值
- sql - Oracle SQL:无法根据多于一列的索引创建外键
- javascript - 如何获取数组
- angular - 特性模块中的延迟加载 - Angular
- spring-boot - Spring Webflux WebExceptionHandler 未被 OptimisticLockingFailure 触发
- javascript - Excel对JS的“力量”功能
- c# - 如何在列表视图中显示网站中的多个会话?
- wordpress - WP Foro 论坛用户组插件
- sqlite - Xamarin 表单 Sqlite 连接:找不到方法:int SQLite.SQLiteConnection.CreateTable (SQLite.CreateFlags)