未捕获的异常:绑定EADDRINUSE,但是使用该端口未找到任何进程

时间:2019-07-14 05:30:17

标签: node.js process socket.io port

我正在构建一个使用端口的Node.js应用程序。关闭应用程序并再次打开后,出现此错误:

CREATE TABLE kube_resource_version (
    one_row_id BOOL NOT NULL DEFAULT true,
    resource_version VARCHAR(255),
    PRIMARY KEY (one_row_id),
    CONSTRAINT kube_resource_version_one_row_id CHECK (one_row_id),
    CHECK (one_row_id IN (0, 1))
)

当然,我在线检查了一下,发现我应该运行命令Uncaught Exception: Error: bind EADDRINUSE 0.0.0.0:20802 at _handle.lookup (dgram.js:282:18) at process._tickCallback (internal/process/next_tick.js:63:19) ,我尝试了sudo lsof -t -i tcp:20802,并且我也尝试了lsof -i:20802来检查/杀死正在使用该命令的进程。端口,没有成功。奇怪的是找不到任何进程。我尝试并使用几种工具进行了多次检查,似乎该端口实际上未被任何应用程序使用。

每次关闭应用程序时,我都有一个执行sudo kill $(sudo lsof -t -i:20802)的侦听器,因此,在退出应用程序时,我不应该打开任何端口。

任何帮助将不胜感激。

编辑:这在运行dgram的client.stop()时失败,我什至在与库(kill-port)绑定之前尝试释放端口,但仍然失败。请检查附件中的图像。

I am killing the port before binding, and I am still getting an EADDRINUSE error

Terminal output

2 个答案:

答案 0 :(得分:0)

我在node express上遇到了几乎相同的问题,当我运行程序时说是EADDRINUSE。对我来说,解决方案是再次重新启动代码,并在第二次启动时开始工作。

答案 1 :(得分:0)

您需要使用exclusive: false绑定到套接字。驱动程序级别的基础TCP堆栈支持套接字选项SO_REUSEADDRSO_REUSEPORT(有关更多详细信息,请参见手册页)。例如,这是为了支持重新绑定到服务器实现中的相同端口。

从节点文档中:

  

options对象可能包含在群集模块中使用dgram.Socket对象时使用的其他独占属性。当Exclusive设置为false(默认值)时,集群工作人员将使用相同的基础套接字句柄,以共享连接处理职责。但是,如果独占设置为true,则不会共享该句柄,并且尝试进行端口共享会导致错误。

socket.bind({
  address: 'localhost',
  port: 8000,
  exclusive: false
});

更新:

使用dgram.createSocket(options[, callback])创建套接字,并按照说明设置选项

  

reuseAddr为true时,即使另一个进程已经在其上绑定了套接字,socket.bind()也会重用该地址。默认值:false。

参考