PM2 с NodeJS дграм - PullRequest
       55

PM2 с NodeJS дграм

0 голосов
/ 15 февраля 2020

Я пытаюсь запустить приложение NodeJS (udp_recv), используя pm2. Приложение запускается при загрузке через запуск 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 stop all) и перезапущу (pm2 start all), то ошибки не будет, и приложение будет нормально работать без любая ошибка.

Мой IP-адрес 192.168.0.9 прослушивает потоки UDP на предопределенном порту. Компьютер, подключенный через ethe rnet отправляет потоки UDP с IP 192.168.0.6

Может кто-нибудь подсказать, как устранить ошибку?

1 Ответ

0 голосов
/ 15 февраля 2020

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

Отключение привязки сразу после перезагрузки через dgram может привести к ошибке. Просто потому, что «EADDRNOTAVAIL» означает, что адрес недоступен.

Решение setTimeout для 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
        })
});
...