Как отладить nodejs .ECONNRESETError: сокет зависает - PullRequest
0 голосов
/ 17 февраля 2020

когда я отправляю форму с большим объемом файла данных, сокет будет внезапно закрыт удаленным сервером. Возможно, поэтому я получил ошибку ECONNRESET. Как ее решить?

мой nodejs код:

Promise((resolve, reject) => {
  let sendOption = {
    method: 'post',
    host: host,
    port: port,
    path: path,
    headers: form.getHeaders(),
    timeout: options.maxTimeout ? 1 * 60 * 60 * 1000 : 2 * 60 * 1000,
  }
  if (options.userName && options.passWord) {
    let auth = new Buffer(options.userName + ':' + options.passWord).toString('base64');
    sendOption.Authorization = 'Basic ' + auth;
  }
  let request = http.request(sendOption, (res) => {
    let body = ''
    res.on('data', function (chunk) {
      body += chunk;
    });
    res.on('end', () => {
      resolve(JSON.parse(body))
    })
  });
  request.on('error', (err) => reject(err));
  request.write(form.getBuffer());
  request.end();
})

Полная ошибка:

2020-02-17 19:09:25,570 ERROR 18664 [-/::1/-/14867ms POST /thirdPartUpload] nodejs.ECONNRESETError: socket hang up
    at connResetException (internal/errors.js:570:14)
    at Socket.socketOnEnd (_http_client.js:440:23)
    at Socket.emit (events.js:215:7)
    at endReadableNT (_stream_readable.js:1184:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21)
code: "ECONNRESET"
name: "ECONNRESETError"
pid: 18664
hostname: PC-HZ20139584
    enter code here

1 Ответ

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

POST-запросам нужно Content-Length: заголовков, объявляющих длину их тел. В вашем случае вы отправляете тело своего POST с request.write(form.getBuffer());

Отсутствующий или неправильный заголовок Content-Length: может выглядеть на сервере как попытка использования уязвимости. Таким образом, серверы хлопают дверью (внезапно закрывают соединение) для тех запросов, которые отображаются в вашем клиенте как ECONNRESET.

Попробуйте что-то вроде этого.

const buff = form.getBuffer();
request.setHeader('Content-Length', buff.length);    
request.write(buff);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...