【问题标题】:Nodejs and WebSockets Failed to construct 'WebSocket': The subprotocol '[object Object]' is invalidNodejs 和 WebSockets 无法构造“WebSocket”:子协议“[object Object]”无效
【发布时间】:2020-05-25 07:46:31
【问题描述】:

所以我的主网页 example.com 是通过 cloudflare 运行的,并且拥有来自 Origin -> CF Edge(原始证书)的边缘证书和边缘证书 CF Edge -> Client。我正在通过使用子域 dt.example.com 为我的 websocket 绕过这个,它使用 cloudflare 尽管使用此链接解析源服务器地址而不是 cloudflare 边缘服务器地址(我发现它为我解决了一些问题,或者它可能是使用这种方法会适得其反?)。无论如何,我正在使用免费的 ssl 证书来保护 websockets -

'use strict';
var https = require('https');
var fs= require('fs');
var express = require('express');
var WebSocket = require('ws');

var server = https.createServer({
    cert: fs.readFileSync('../ssl/wss/new/certificate.crt'),
    key: fs.readFileSync('../ssl/wss/new/private.pem'),
    ca: fs.readFileSync('../ssl/wss/new/ca_bundle.crt')
});

const wss = new WebSocket.Server({server});

wss.on('connection', function connection (ws) {
  ws.on('message', function message (msg) {
    console.log(msg);
  });
});

server.listen(58443, function listening () {
    const ws = new WebSocket('wss://dt.example.com:58443', {
        rejectUnauthorized: false
    });
    ws.on('open', function open () {
        ws.send('Workin baby');
    });
});

-并且使用 chrome 的 websocket 客户端插件允许我连接到套接字,但是我不能在 example.com/webpage 上使用以下代码:

var ws = new window.WebSocket('wss://dt.example.com:58443/', {
    rejectUnauthorized: false
});
ws.on('open', function open () {
    ws.send('What\'s crackin?');
});

虽然在浏览器 (Chrome) 中执行客户端脚本时它会退出并出现以下错误 Uncaught DOMException: Failed to construct 'WebSocket': The subprotocol '[object Object]' is invalid. (on line 1)

【问题讨论】:

    标签: javascript node.js websocket


    【解决方案1】:

    我在elswhere 的帖子中偶然发现了一些有趣的东西,设法解决了这个问题。 本质上,我只是将 rejectUnauthorized 移到服务器代码中,然后重试在客户端上运行并连接到服务器:)

    【讨论】:

      【解决方案2】:

      所以有两种方法可以做到这一点,我将它们都列出来,有关更多信息,您可以访问https://www.npmjs.com/package/websocket

      使用 W3CWebSocket

      var ws= require('websocket').w3cwebsocket;
      
      var client = new W3CWebSocket('wss://dt.example.com:58443/'{
          rejectUnauthorized: false
      }, 'echo-protocol');
      
      client.onerror = function() {
          console.log('Connection Error');
      };C
      
      client.onopen = function open () {
      ws.send('What\'s crackin mate?');
      };
      
      client.onclose = function() {
          console.log('echo-protocol Client Closed');
      };
      
      client.onmessage = function(e) {
          if (typeof e.data === 'string') {
              console.log("Received: '" + e.data + "'");
          }
      };
      

      使用普通的 websocket 客户端

      var WebSocketClient = require('websocket').client;
      
      var client = new WebSocketClient();
      
      client.on('connectFailed', function(error) {
          console.log('Connect Error: ' + error.toString());
      });
      
      client.on('connect', function(connection) {
          console.log('WebSocket Client Connected');
          connection.on('error', function(error) {
              console.log("Connection Error: " + error.toString());
          });
          connection.on('close', function() {
              console.log('echo-protocol Connection Closed');
          });
          connection.on('message', function(message) {
              if (message.type === 'utf8') {
                  console.log("Received: '" + message.utf8Data + "'");
              }
          });
      
      });
      
      client.connect('ws://localhost:8080/', 'echo-protocol');
      

      【讨论】:

      • 尝试其中任何一个都不适用于客户端,因为无法识别需求。你将如何解决这个问题?
      • 没关系,我看到这更像是一个服务器到服务器的通信应用程序。
      • 您是否使用 npm i --save websocket 安装了 websocket ?
      • 进入服务器目录是
      • 虽然在浏览器中这不起作用,因为 require 不能被识别为函数,但是编辑代码可以正常工作var client = new window.WebSocket('wss://dt.example.com:58443/'); ...
      【解决方案3】:

      您可以通过key = "Sec-WebSocket-Protocol" 将前端的相应协议值添加到后端的响应头中来解决此问题。 在您的情况下,您应该添加一个带有键“Sec-WebSocket-Protocol”和值“Chat-1.0”的 HTTP 标头

      【讨论】:

      • 最初的问题被标记为 JavaScript 和 node.js,而不是 Java。答案应该在 JavaScript 中。
      猜你喜欢
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多