0

我有这样的代码:

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')看到一切都按预期工作。文档说选项应该相同,但默认值不同。

4

1 回答 1

0

您的确切代码require('https')在 Node.js10和带有 nvm 的 macOS Catalina 上12正常运行。13我得到以下控制台日志:

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

这意味着无论您面临什么问题,它都与您的环境或特定(旧)Node.js 版本中的错误有关。

在清除所有系统缓存、临时文件和与 Node.js 相关的配置文件后尝试重新安装 Node.js。

于 2020-03-12T15:49:49.277 回答