Почему тайм-аут не делает то, что я ожидаю, для модуля узла https? - PullRequest
0 голосов
/ 07 марта 2020

У меня есть такой код:

const https = require('https');

const request = async (data, options) => {
  return new Promise((resolve, reject) => {
    const req = https.request(options, function(res) {
      const chunks = [];

      res.on('data', function(chunk) {
        chunks.push(Buffer.from(chunk));
      });

      res.on('end', function() {
        let body = Buffer.concat(chunks);

        body = body.toString();

        resolve(body);
      });
    });

    if (data) {
      req.write(JSON.stringify(data));
    }

    // this never fires, tried after comment below
    req.on('timeout', () => {
      console.log("This timed out")
    })

    // handle connection errors
    req.on('error', reject);
    req.end();
  });
};

async function run() {
  try {
    const response = await request(null, {
      method: 'GET',
      hostname: 'example.com',
      timeout: 1,
      path: '/',
      headers: {
        'Content-Type': 'application/json'
      }
    });
    console.log(response);
  } catch (e) {
    console.log(e);
  }
}



run();

Документы на https://nodejs.org/api/http.html#http_http_request_options_callback говорят это о timeout:

Число, указывающее время ожидания сокета в миллисекундах. Это установит тайм-аут перед подключением сокета.

Мой вызов, очевидно, займет более 1 мс, но я не получаю никаких ошибок. Что мне здесь не хватает?

Обновление

Я могу заставить req.on('timeout' работать, когда я использую модуль http вместо https. Не уверен, почему это будет по-другому? Я буквально могу изменить require('https') на require('http') и посмотреть, как все работает, как ожидалось. Документы говорят, что параметры должны быть идентичными, но с разными значениями по умолчанию.

1 Ответ

0 голосов
/ 12 марта 2020

Ваш точный код с require('https') правильно работает на Node.js 10, 12 и 13 на macOS Catalina с nvm. Я получаю следующий консольный журнал:

This timed out
{"error_code":"401013","message":"Oauth token is not valid"}

Это означает, что с любой проблемой, с которой вы сталкиваетесь, она связана с вашей средой или с ошибкой в ​​указанной c (старой) Node.js версии.

Попробуйте переустановить Node.js после очистки всего системного кэша, временных файлов и Node.js связанных файлов конфигурации.

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