got.stream does not work with Node.js ≥ 13.10.0. Node.js 13.9.0 works fine.
When piped into a stream, the receiving stream receives no data.
When piped into a stream, the receiving stream receives the entire HTTP response.
const got = require("got");
got.stream("https://www.github.com/").pipe(process.stdout);
// one can also use stream.pipeline here. Same result.
With Node.js < 13.9.0, output fills the screen. With ≥ 13.10.0, there is no console output.
Same behavior here but all got is affected not only streams :
const got = require("got");
// ensure no exit before the timer was cleared
const interval = setInterval(() => {}, 60000);
(async () => {
console.log('step 1');
const result = await got("https://www.github.com/");
console.log(result);
console.log('step 2');
clearInterval(interval);
})();
This code never throws, exits or output results. It only display step 1 and do nothing more. Before node 13.10.0 it displays results.
2 hours of debugging and searching for my mistake... 😄
Same here after upgrading Node to v13.10.1.
@szmarczak Are there plans to backport the fix into a minor / patch release? This bug is fairly serious. Yarn 2 relies on Got, which causes builds to abort mid-sequence.
It's gonna be a patch release. I'm working on this right now.
LOL @nodejs messed up!
const {PassThrough, pipeline} = require('stream');
const https = require('https');
const body = new PassThrough();
const request = https.request('https://example.com');
request.once('abort', () => {
console.log('The request has been aborted');
});
pipeline(
body,
request,
error => {
console.log(`Pipeline errored: ${!!error}`);
}
);
body.end();
gives
Pipeline errored: false
The request has been aborted
This is the culprit: https://github.com/nodejs/node/pull/31940/files#diff-eefad5e8051f1634964a3847b691ff84R36
It calls .abort() on every request you make using pipeline.
@szmarczak Are you sure pipeline is the issue here? My original example used the plain old .pipe().
I am sure. I see you haven't looked at Got source code. Few people do.
Waiting for:
Node's team have released a new version (13.11.0) today that may fix this issue. Depending of your download source for node and your os, the release may not be available right now. For example, the ubuntu version is not available at this instant from nodesource.
Tests are still failing on Node.js 13.11.0. I'll look at this later today.
Updating to Node.js v13.11.0 has fixed the issue for me!
Glad to hear this! But the tests are still failing, so there's some fixing needed to be done. I haven't looked at this yet, need to get some sleep...
Same for me, node v13.11.0 fixes this issue for my usages.
It's the first time I use this library, I haven't used nodejs for a long time so it took me a long time to even get here, not to mention that I did not read got's source code... I'm using node v13.11.0 and the bug is still there for me. How can this happen on an LTS release? This is my code:
async function() {
try {
const response = await got.post(API_URI + '/Account/token');
console.log("hello"); //never reached
}
catch (e) {
// never reached
}
}
Is there any workaround?
Nose.js v13.x is not an LTS branch.
It's the first time I use this library, I haven't used nodejs for a long time so it took me a long time to even get here, not to mention that I did not read got's source code... I'm using node v13.11.0 and the bug is still there for me. How can this happen on an LTS release? This is my code:
async function() { try { const response = await got.post(API_URI + '/Account/token'); console.log("hello"); //never reached } catch (e) { // never reached } }Is there any workaround?
Can you provide a reproducible example ? Your use case is too imprecise. I use got and node (v13.11.0) intensively and I have no problem other than https://github.com/sindresorhus/got/issues/1096 which is not node version related and is similar to yours.
All works with node v13.12.0
async function test() {
try {
const response = await got.get('https://google.com');
console.log(response); // ok
}
catch (err) {
console.error(err);
}
}
async function testError() {
try {
const response = await got.get('https://google1.com');
console.log(response);
}
catch (err) {
console.error(err); // ok
}
}
As of Node.js v13.11.0 and 48b817e all tests pass :D
Most helpful comment
Same behavior here but all got is affected not only streams :
This code never throws, exits or output results. It only display
step 1and do nothing more. Before node 13.10.0 it displays results.