I have code like this:
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();
The docs at https://nodejs.org/api/http.html#http_http_request_options_callback say this about timeout
:
A number specifying the socket timeout in milliseconds. This will set the timeout before the socket is connected.
My call is obviously going to take more than 1MS, yet I am not getting any errors thrown. What am I missing here?
Update
I am able to get req.on('timeout'
to work when I am using http
module rather than https
. Not sure why that would be different? I literally can change require('https')
to require('http')
and see everything work as expected. The docs say options should be identical, but with different defaults.