带有 NodeJS dgram 的 PM2

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 全部启动) 然后没有错误,应用程序 运行s 正常没有任何错误。

我的 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)

此外,另一种解决方案是尝试 reconnect/rebind 服务器错误 "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
        })
});