Приложение Node.js аварийно завершает работу, когда удаленный хост закрывает сокетное соединение - PullRequest
1 голос
/ 16 октября 2019

Вот исходный код сокета сервера:

const server = net.createServer(client => {
   // 'connection' listener.
   let processing = false;

   client.setTimeout(config.socket.timeout);
   client.on('data', data => {
      const batches = data.toString().split(',');

      if (!processing && batches && batches.length) {
         processing = true;

         processBatch(batches, error => {
            const status = error ? 'ERR' : 'SUCC';

            logger.verbose('... Ended with status : ' + status);

            client.write(status, () => client.end());
         });
      }
   });
   client.on('timeout', () => {
     logger.warn('Client socket did time out');
     client.end();
   });

   //client.on('end', () => {});
});
server.on('error', error => {
   logger.info('Socket error');
   logger.error('Error: ', error);
});
server.listen(config.socket.port, () => {
   console.log('*** Socket listening on port', config.socket.port);
});

Клиент установит соединение, отправит свои данные и затем удаленно закроет соединение, что приводит к запуску обработчика ошибок сервера, ведению журналасообщение:

Error: This socket has been ended by the other party
    at Socket.writeAfterFIN [as write] (net.js:441:14)
    at file:///home/thermo/bwkl/src/service.js:191:20
    at file:///home/thermo/bwkl/src/service.js:123:13 {
 code: 'EPIPE'
}

Как это можно предотвратить и изящно закрыть клиентский сокет, когда удаленный хост преждевременно завершил соединение?

1 Ответ

2 голосов
/ 16 октября 2019

Обработчик ошибок server не перехватывает ошибку соединения, поскольку событие ошибки генерируется client.

. Вы должны определить прослушиватель для события error в экземпляре client вДля обработки рассматриваемой ошибки:

client.on('error', (err) => {
  console.log('Connection error:', err.message);
});

Это предотвратит сбой процесса Node.js. Вы можете обработать ошибку как угодно внутри слушателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...