我有这样的代码:
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 10
、12
和13
上正确运行。我得到以下控制台日志:
This timed out
{"error_code":"401013","message":"Oauth token is not valid"}
这意味着,无论您面临什么问题,都与您的环境或特定(旧(Node.js版本中的错误有关。
清除所有系统缓存、临时文件和与Node.js相关的配置文件后,尝试重新安装Node.js。