Node.js和WebSockets无法构造'WebSocket':子协议'[object Object]'无效

时间:2018-07-18 05:50:19

标签: javascript node.js websocket

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

'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)

3 个答案:

答案 0 :(得分:0)

我设法通过绊倒帖子elswhere中有趣的内容来解决此问题。 本质上,我只是将rejectUnauthorized移到服务器代码中,然后重试在客户端上运行并将其连接到服务器:)

答案 1 :(得分:0)

因此,有两种方法可以列出这两种方法,有关更多信息,您可以访问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');

答案 2 :(得分:-1)

您可以通过使用key =“ Sec-WebSocket-Protocol”将前端的相应协议值添加到后端的响应头中来解决此问题。 对于您的情况,您应该添加一个HTTP头,其键为“ Sec-WebSocket-Protocol”,值为“ Chat-1.0”