为什么超时没有为https节点模块做我期望的事情?



我有这样的代码:

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:

以毫秒为单位指定套接字超时的数字。这将在连接套接字之前设置超时。

我的调用显然需要超过1MS的时间,但我没有遇到任何错误。我在这里错过了什么?

更新

当我使用http模块而不是https时,我能够使req.on('timeout'工作。不知道为什么会有所不同?我确实可以将require('https')更改为require('http'),并看到一切按预期工作。文档中说,选项应该相同,但默认值不同。

使用require('https')的精确代码在带有nvm的macOS Catalina上的Node.js 101213上正确运行。我得到以下控制台日志:

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

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

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

相关内容

最新更新