我有一个Node.js服务器运行在Docker容器内.我试图从Web浏览器使用WebSockets连接到服务器,但一旦建立连接,我得到一个错误:

WebSocket connection to 'wss://domain/api/websockets' failed: One or more reserved bits are on: reserved1 = 1, reserved2 = 0, reserved3 = 0.

我访问了Docker容器,并try 使用

wscat --header "Cookie:connect.sid=session-key" -c ws://127.0.0.1:5200/api/websockets

但是得到了一个错误:

error: Invalid WebSocket frame: RSV1 must be clear

我应该注意的是,在初始连接期间,我从服务器收到了有效的数据包,但不久之后,连接中断并出现了上述错误.

下面是服务器的代码:

import WebSocket, { WebSocketServer } from "ws";
import { Server } from "http";
import { sessionParser } from "../passport";
import { User } from "../../share-types";
import { events, EventsList } from "./events";

export default async (server: Server) => {
    const wsServer = new WebSocketServer({
        noServer: true,
        path: '/api/websockets',
    });
    server.on('upgrade', (request: Express.Request, socket, head) => {
        sessionParser(request, {}, () => {
            const user: User = request.session?.passport?.user;
            if (!user?.ID) return socket.destroy();
            wsServer.handleUpgrade(request as any, socket, head, (ws) => {
                wsServer.emit('connection', ws, request, user);
            });
        })
    });


    wsServer.on('connection', function (socket: WebSocket, request: Express.Request, user: User) {

        socket.on('error', console.error);
        socket.on('message', function (message) {
            try {
                message = JSON.parse(message.toString());
                events.emit(EventsList.NEW_WEB_SOCKET_MESSAGE, { user, message });
            } catch { }

        });
    });

    return wsServer;
};

WS包版本: "ws":"^8.16.0"

有什么问题?

推荐答案

这与websockets/ws issue 2109个类似,其中包括:

我在远程服务器上运行我的原始代码,使用Chrome访问它,一切都运行正常.因此,这个问题似乎只有在我使用本地主机时才会发生.不知道为什么我的本地主人还不好.

以及:

我最终找到了一个解决方案--使用8080以外的端口.

我仍然不知道为什么那个端口不工作,而其他的端口却没有工作.我的理论是,Mac Docker对它做了一些奇怪的事情,导致它表现出我上面发现的行为,但一旦我发现我可以简单地切换端口,我就停止了调查.

所以:

只是为了给其他人一个参考,你在这个问题上敲他们的头.我们也有类似的问题,结果是Parental Control was enabled on the laptop which hijacked port 8080.结论:不要在Mac OSX上使用8080...


在您的情况下,可能不涉及8080,但try 切换端口,看看问题是否仍然存在.

Javascript相关问答推荐

使用json文件字符串来enum显示类型字符串无法按照计算的enum成员值的要求分配给类型号

如何从JSON数组添加Google Maps标记—或者如何为数组添加参数到标记构造器

嵌套异步JavaScript(微任务和macrotask队列)

如何修复(或忽略)HTML模板中的TypeScript错误?'

如何在Obsidian dataview中创建进度条

如何将Openjphjs与next.js一起使用?

如何从HTML对话框中检索单选项组的值?

JQuery Click事件不适用于动态创建的按钮

如何在我的Next.js项目中.blob()我的图像文件?

为什么可选参数的顺序会导致问题?

如果一个字符串前面有点、空格或无字符串,后面有空格、连字符或无字符串,则匹配正则表达式

删除加载页面时不存在的元素(JavaScript)

在D3条形图中对具有相同X值的多条记录进行分组

如何使本地html页面在重新加载时保持当前可隐藏部分的打开状态?

如何在AG-Grid文本字段中创建占位符

JavaScript -复制到剪贴板在Windows计算机上无效

使用Java脚本筛选数组中最接近值最小的所有项

单击子按钮时将活动切换类添加到父分区

使用JAVASCRIPT-使用If和Else If多次判断条件-使用JAVASRIPT对象及其属性

如何从图表中映射一组图表-js使用REACT