【问题标题】:Nodejs "WebSocket is closed before the connection is established" socket.io espressNodejs“建立连接之前关闭WebSocket”socket.io espress
【发布时间】:2018-02-05 04:36:22
【问题描述】:

我有这个问题,我从未遇到过,而且我发现的所有其他帖子都对我没有帮助。

事实上,我在受 SSL 保护的网站上使用带有 Express 和 Socket.io 的 NodeJS,但出现此错误:“WebSocket connection to 'wss://site.domain:8001/socket.io/?EIO= 3&transport=websocket' failed: WebSocket在连接建立之前就关闭了。"

所以我在互联网上搜索,发现了很多有趣的东西,甚至有人和我有完全相同的问题,但没有人回答他们,有时它只是不起作用。

我有 2 个文件,正常情况下,我有一个名为“server.js”的服务器文件和一个名为“agent.php”的客户端文件。

server.js

var fs = require('fs');
var https = require('https');

var mysql = require('mysql');
var express = require('express');
var app = express();

var options = {
  key: fs.readFileSync('/var/www/html/site.domain/public_html/cert/domain.key'),
  cert: fs.readFileSync('/var/www/html/site.domain/public_html/cert/domain.pem')
};
var serverPort = 8001;

var server = https.createServer(options, app);
var io = require('socket.io')(server);

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/public/index.html');
});


var con = mysql.createConnection({
  host: "127.0.0.1",
  user: "user",
  password: "password",
  database: "dbname"
});

con.connect(function(err) {
  if (err) throw err;
  console.log("Connected to mysql!");
});

io.on('connection', function(socket) {
  console.log('new connection');
});

server.listen(serverPort, function() {
  console.log('server up and running at %s port', serverPort);
});

按预期在控制台中写入“服务器已启动并在 8001 端口运行”会产生此结果。但是由于我认为的错误,当您加载页面时不会打印“新连接”。

agent.php

<!DOCTYPE HTML>
<html>
  <head>
    <title>TERMINAL - AGENT</title>
    <link rel="stylesheet" type="text/css" href="/assets/css/agent.css?version=<?php $v=rand(100,9999999999); echo $v;?>">
    <link rel="stylesheet" type="text/css" href="/assets/css/main.css?version=<?php $v=rand(100,9999999999); echo $v;?>">
    <link rel="shortcut icon" href="/images/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/images/favicon.ico" type="image/x-icon">
    <META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
    <link href="https://fonts.googleapis.com/css?family=Cairo|Pontano+Sans:400,600|Rajdhani:400,600|Teko:400,600|Titillium+Web:400,600|Exo:400,600|Open+Sans+Condensed:400,600|sans-serif|Anton:400,600|VT323|Grand+Hotel|Anonymous+Pro:400,400i,700,700i" rel="stylesheet">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
  </head>
  <body>

    *A lot of html stuff which is not important at all*

    <script type="text/javascript">
      <?= 'var mat = '.htmlspecialchars($_GET['mat']).';' ?>
      $( document ).ready(function (){
        var url = window.location.protocol + "//" + window.location.hostname + ":8001";
        var socket = io(url, {transports: ['websocket'], upgrade: false});

      });
    </script>
  </body>
</html>

结果是错误。我现在真的不知道该怎么办,我已经使用了我所有的知识并且我也进行了很多搜索。

【问题讨论】:

  • 您是否 100% 确定您在客户端和服务器上拥有相同版本的 socket.io,因为当它们不匹配时,它会表现出与您描述的完全相同的症状。如果您将&lt;script src="/socket.io/socket.io.js"&gt;&lt;/script&gt; 用于客户端socket.io 库,那么您将始终获得正确的版本,因为它将由socket.io 服务器自动提供。
  • 另外,var socket = io(); 工作还是有同样的问题?
  • 好吧,我知道 /socket.io/socket.io.js 但我从来没有让它工作,事实上我在使用它时总是遇到 3 个错误。 1. /socket.io/socket.io.js 上的 404 2. io 未定义 3. io 未定义 gyazo.com/486da3a68beef01cd1abd38012cc7cf5 您可以看到 404(GET url)在页面“civil”而不是“agent”但它是“代理”的副本
  • 您的网页是否来自您的 socket.io 服务器所在的同一台服务器?如果您连接到同一主机,那么/socket.io/socket.io.js 应该可以正常工作。或者你想连接到一些不同的主机?另外,您是否检查了我第一条评论中的 socket.io 版本?
  • 我检查了版本以及服务器和客户端(导入时),但它不工作。我在同一台服务器上使用客户端和服务器,该服务器是 ovh 租用的 VPS,也是 var socket = io();没有解决任何问题。

标签: javascript node.js express socket.io


【解决方案1】:

好的,我发现了我的问题!我正在使用 cloudflare 使网站更安全并处理 https。所以我用 CloudFlare 禁用了所有的东西,现在它可以工作了……但只是在不安全的情况下。我在 apache 中设置了 SSL 东西,它在非 nodejs 页面中运行良好,但在 nodejs 中它不起作用。这样一个问题就解决了!希望对可能遇到和我一样问题的人有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-13
    • 2021-05-29
    • 2017-12-23
    • 2019-12-14
    • 1970-01-01
    • 2022-12-15
    • 2020-10-21
    • 1970-01-01
    相关资源
    最近更新 更多