当前位置: 首页 > 面试题库 >

Node.js socket.io-client connect_failed / connect_error事件

董联
2023-03-14
问题内容

我在玩node.js和socket.io-client。我试图连接到一个不存在的通道,以触发事件“
connect_failed”(在https://github.com/LearnBoost/socket.io-
client中
指定)。

但是我无法使事件正常运行:

var clientio = require('socket.io-client');
console.log('Trying stuff ...');

// the channel does not exist
var socket = clientio.connect( 'http://localhost:4000/news' );

// I expect this event to be triggered
socket.on('connect_error', function(){
    console.log('Connection Failed');
});
socket.on('connect', function(){
    console.log('Connected');
});
socket.on('disconnect', function () {
  console.log('Disconnected');
});
socket.send('hi there');

如果我执行将发生这种情况:

$ node tmp_clientio.js 
Trying stuff ...

如果连接到不存在的通道如何触发错误的任何想法?

更新 :重命名connect_failedconnect_error


问题答案:

我遇到了同样的问题。我也曾遇到过命名空间模式的打开和关闭之间存在未记录的差异,最后我不得不使用chrome调试器来解决它。

// Bind to the news namespace, also get the underlying socket
var ns_news = clientio.connect( 'http://localhost:4000/news' );
var socket = ns_news.socket

因此,在上面看到,如果要绑定“套接字级别”事件(例如连接失败,断开连接等),则必须从名称空间获取 实际的套接字 ns_news.socket

// Global events are bound against socket
socket.on('connect_failed', function(){
    console.log('Connection Failed');
});
socket.on('connect', function(){
    console.log('Connected');
});
socket.on('disconnect', function () {
  console.log('Disconnected');
});


// Your events are bound against your namespace(s)
ns_news.on('myevent', function() {
    // Custom event code here
});

请注意,您现在使用ns_news发送或接收事件

ns_news.send('hi there');

最后,请确保也绑定socket.on('error', ...)事件-如果端口不可用,则会发生该事件

8080的全部实现与回退到端口80的连接

我在实现中进行了此操作(尝试端口8080,如果失败,请通过nginx尝试端口80)

socket_port = 8080;

ns_dash = io.connect("http://your.gridspy.co.nz/dash", {
  port: socket_port,
  'connect timeout': 5000,
  'flash policy port': 10843
});

socket = ns_dash.socket;

try_other_port = function() {
  if (socket_port !== 80) {
    if (typeof console !== "undefined" && console !== null) {
      console.log("Trying other port, instead of port " + socket_port + ", attempting port 80");
    }
    socket_port = 80;
    socket.options.port = socket_port;
    socket.options.transports = ['htmlfile', 'xhr-multipart', 'xhr-polling', 'jsonp-polling'];
    return socket.connect();
  } else {
    return typeof console !== "undefined" && console !== null ? console.log("No other ports to try.") : void 0;
  }
};
socket.on('connect_failed', function() {
  if (typeof console !== "undefined" && console !== null) {
    console.log("Connect failed (port " + socket_port + ")");
  }
  return try_other_port();
});
socket.on('error', function() {
  if (typeof console !== "undefined" && console !== null) {
    console.log("Socket.io reported a generic error");
  }
  return try_other_port();
});

我还添加了一个nginx proxy_pass规则,看起来像这样

location ~ ^/(socket.io)/ {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    proxy_set_header Host $http_host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

要升级nginx和socket.io之间的连接以支持websocket,需要使用Upgrade和Connection选项(来自nginx的最新版本)。这意味着您的网络服务器可以在端口80上支持网络套接字。

此外,如果您的服务器支持ssl / https,它将代理wss,这是websockets的安全版本。



 类似资料:
  • error (对象) 错误对象 连接错误触发事件处理器。 socket.on('connect_error', (error) => { // ... });

  • error (对象) 错误对象 触发连接错误事件。

  • 我一整天都在尝试让我的Nginx/React应用程序连接到我的Node.js后端,它在我的开发环境中工作得很好。我的前端和后端部署在同一个虚拟机上各自的Docker容器中。Nginx容器可以直接与Node.js容器通信,它被确认工作正常,因为其他get/post请求工作正常。 这是我最初的Nginx配置。 这是我在控制台上看到的错误: < code > POST http://domain _ n

  • 我正在尝试使用webrtc和socket通过getUserMedia()获取音频。io将其发送到服务器(socket.io支持音频、视频、二进制数据),然后服务器将其广播到所有连接的客户端。问题是,当流到达连接的客户端时,它会转换为JSON对象,而不是媒体流对象。所以我无法发送音频,我也尝试了套接字。io流模块,但我认为未成功。您能帮我正确捕获音频流并将其发送到所有连接的客户端吗。 下面是发送数据

  • 主要问题: 我试图在网页上打印错误,如果连接到MySQL服务器不做。为此,我写了一个错误的库名

  • 很多企业在使用诸葛io时,会采集和分析数量非常多(可能会多达几百上千)的用户行为事件。这时,事件查找和组织就变得不够方便。 为此,诸葛io提供了事件分组和重要事件(星标事件)标注功能,当事件很多时,可以对事件进行分门别类地管理。同时,可以从产品业务角度将重要的用户行为标注出来,以便可以在分析时方便、快捷地查找常用、重要的事件。 一、使用场景 1. 在众多事件中,方便、快捷地查找重要事件 在分析过程