为啥 Node.js 无法连接到套接字时不会抛出错误?

Posted

技术标签:

【中文标题】为啥 Node.js 无法连接到套接字时不会抛出错误?【英文标题】:Why doesn't Node.js throw an error when it can't connect to socket?为什么 Node.js 无法连接到套接字时不会抛出错误? 【发布时间】:2021-06-28 23:05:55 【问题描述】:

当我调用这两个函数时,只有上一个函数失败并返回错误

const  Socket  = require("net")

class Client 
  connect () 
    this.a = new Socket()  
    this.a.connect(this.port, this.host)
    
    this.socket = new Socket()  
    this.socket.connect(this.port, this.host)
  

问题是,我知道应该连接的端口没有被使用。这两个函数都应该抛出错误。 如果我先调用较低的,带有 this.a 的仍然失败。

如果我同时使用 this.socket,第一个总是失败,即使我改变了它们的顺序。

为了区分它们,我使用了不同的端口来连接,但也未使用。

this.socket = new Socket()
this.socket.connect(6743, this.host)

this.a = new Socket()
this.a.connect(6744, this.host)

this.port 和 this.host 变量不是问题,因为如果在端口上的服务器在线时运行脚本,它可以工作。

应该抛出的错误信息:

events.js:291
      throw er; // Unhandled 'error' event
      ^

Error: connect ECONNREFUSED 127.0.0.1:6744
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1145:16)
Emitted 'error' event on Socket instance at:
    at emitErrorNT (internal/streams/destroy.js:106:8)
    at emitErrorCloseNT (internal/streams/destroy.js:74:3)
    at processTicksAndRejections (internal/process/task_queues.js:80:21) 
  errno: -4078,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 6744
```

【问题讨论】:

我不明白。它们都连接到相同的主机和端口。 当第一个抛出错误时,第二个永远不会执行。 这就是为什么我说,我改变了顺序,首先执行的是带有 this.socket 的那个,然后是带有 socket.a 的那个,现在在下面,仍然失败,而不是第一个。 你写的“第一个总是失败”。 它不会抛出错误,它会触发error 事件。 【参考方案1】:

就像其他用户提到的那样,第二个错误没有被触发,因为应用程序在第一个错误之后实际上停止了运行。为了证明这一点,您可以尝试在两次连接套接字的尝试之间放置一个console.log,然后看看它也不会按预期运行。

【讨论】:

对不起,我解释得很糟糕。问题是如果反转它(如在我添加的第二个代码示例中)仍然是带有 this.a 的那个会引发错误,除了 this.socket 在它之前被调用 那么你是说如果你把this.socket放在前面,它不会抛出错误? 它抛出一个,但只在this.a,如果只运行this.socket它不会抛出错误 如果你说在它自己的作品上运行this.socket,但是在任何地方使用this.a 都不起作用,在不了解你的设置的情况下,我倾向于认为发生了一些愚蠢的事情变量名冲突。您是否尝试过将this.a 更改为this.abraKadabra 之类的东西?【参考方案2】:

在 nodeJs 中某些模块在事件中抛出错误

event.on('error') 中的套接字抛出错误,您应该检查事件

希望下面的链接对你有帮助:

https://***.com/a/25847067/6759368

【讨论】:

以上是关于为啥 Node.js 无法连接到套接字时不会抛出错误?的主要内容,如果未能解决你的问题,请参考以下文章

Web 套接字和 Flash 套接字客户端连接到一个 Node.js

Socket.io 不会按需关闭套接字(并且不允许我的 swift 应用程序再次重新连接到 node.js 服务器)

使用 node.js 连接到 nem 测试节点时出错

为啥我的客户端应该只连接到一个子节点集群工作人员时接收来自所有子节点集群工作人员的套接字发射?

我无法连接到Google应用引擎灵活的环境实例。 Node.js的

为啥当未接受的套接字发送消息时,套接字不会抛出错误?