PM2 with NodeJS dgram



我正在尝试使用 pm2 运行 NodeJS 应用程序(udp_recv(。 应用程序通过 pm2 启动和 pm2 保存在启动时启动。 但是,dgram给了我一个错误说 -

server error:
1|udp_recv | Error: bind EADDRNOTAVAIL 192.168.0.9:7001
1|udp_recv |     at state.handle.lookup (dgram.js:242:18)
1|udp_recv |     at process._tickCallback (internal/process/next_tick.js:63:19)
1|udp_recv |     at Function.Module.runMain (internal/modules/cjs/loader.js:834:11)
1|udp_recv |     at startup (internal/bootstrap/node.js:283:19)
1|udp_recv |     at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)

但是一旦我停止所有应用程序(pm2 停止所有(并重新运行(pm2 启动所有( 然后没有错误,应用程序正常运行,没有任何错误。

我的 IP 是 192.168.0.9,在预定义端口上侦听 UDP 流。通过以太网连接的计算机从 IP 192.168.0.6 发送 UDP 流

有人可以告诉我如何解决错误吗?

https://forums.balena.io/t/eaddrnotavail-when-trying-to-bind-socket-after-device-turns-back-on/4285

事实证明,通过 dgram 重新启动后立即绑定可能会导致错误。 仅仅因为"EADDRNOTAVAIL"意味着地址不可用。

解决方案集 socket.bind 上的超时大约为 60 秒,它会正常工作。

setTimeout(() => {
server.bind({
address: "127.0.0.1",
port: process.env.SERVER_PORT,
exclusive : true
})
}, 60000)

此外,另一种解决方案是尝试在服务器错误"EADDRNOTAVAIL"时重新连接/重新绑定

//If server(app.js) gets any error
server.on('error', (err) => {
console.log(`server error:n${err.stack}`);
//Server is closed
//server.close();
//add an "if" block to check if the error is of type "EADDRNOTAVAIL"
server.bind({
address: "127.0.0.1",
port: process.env.SERVER_PORT,
exclusive : true
})
});

最新更新