我正在构建一个使用端口的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)绑定之前尝试释放端口,但仍然失败。请检查附件中的图像。
答案 0 :(得分:0)
我在node express上遇到了几乎相同的问题,当我运行程序时说是EADDRINUSE。对我来说,解决方案是再次重新启动代码,并在第二次启动时开始工作。
答案 1 :(得分:0)
您需要使用exclusive: false
绑定到套接字。驱动程序级别的基础TCP堆栈支持套接字选项SO_REUSEADDR
和SO_REUSEPORT
(有关更多详细信息,请参见手册页)。例如,这是为了支持重新绑定到服务器实现中的相同端口。
从节点文档中:
options对象可能包含在群集模块中使用dgram.Socket对象时使用的其他独占属性。当Exclusive设置为false(默认值)时,集群工作人员将使用相同的基础套接字句柄,以共享连接处理职责。但是,如果独占设置为true,则不会共享该句柄,并且尝试进行端口共享会导致错误。
socket.bind({
address: 'localhost',
port: 8000,
exclusive: false
});
更新:
使用dgram.createSocket(options[, callback])
创建套接字,并按照说明设置选项
reuseAddr为true时,即使另一个进程已经在其上绑定了套接字,socket.bind()也会重用该地址。默认值:false。
参考: