You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
we run into random ECONNRESET problems for weeks now and tried many things to mitigate the problem. We use supertest for e2e testing a GraphQL API built with Nest.js.
The reason we do all the GraphQLQuery._bindings-stuff is because we are aware that those bindings should be reused. We create the Nest.js app in our beforeAll()-hooks, where we also add the testHash to the HTTP Server. It's basically a UUID to ensure that we can map bindings to test-suites. We also run Jest with --runInBand on the CI, so nothing should run concurrently. We have around 80 tests now which all rely on supertest and the more tests we build, the worse it gets. Up until to a point where we need to run the whole CI-step multiple times until ECONNRESET doesn't happen any more. Sometimes up to 10 times or so, with each pipeline needing ~5 minutes.
Unfortunately I didn't find much information about our problems and since Nest.js recommends supertest (and I think I can say that on behalf of the team, we really like the approach), I am wondering what we're missing.
Any update here? I seem to be getting a similar error:
Error: ECONNRESET: Connection reset by peer
at Test.assert (./node_modules/supertest/lib/test.js:193:18)
at localAssert (./node_modules/supertest/lib/test.js:159:12)
at ./node_modules/supertest/lib/test.js:156:5
describe('a lot of calls',function(){this.timeout(10000)it('should handle many requests',(done)=>{constapp=express();app.get('/',(req,res)=>{res.send('hi');})constagent=request(app)constreqFn=(i)=>{returnnewPromise((resolve,reject)=>{constst=setTimeout(()=>{clearTimeout(st)constreq=agent.get('/')req.end((err,res)=>{if(err){console.log(i,err.message);reject(err)}else{res.text.should.be.eql('hi');resolve()}});},100)})}constpromises=[]for(leti=0;i<200;i++){promises.push(reqFn(i))}Promise.all(promises).then(()=>done()).catch(err=>done(err))});});
There are may be different output in terminal after executions:
same error with me. ECONNRESET is showing when running many tests, but It does not show when running the same test individually. In my case, I am not using Nest
My solution is to call app.getHttpServer().listen(0); after test app initialization in the beforeAll hook. This way the HTTP server can warm up and all supertest calls use the same address.
So far worked fine for me. Hope that helps in your case as well.
Reacted by wiktor-jozwik-polcode, Fabian Fuelling, mmorin-equisoft, Mahmoud Almontasser, Siarhei Korbut, Joseph Hughes, Amir A., Herman, gterras, lorraineliuu and 3 more
Reacted by Mahmoud Almontasser, mmorin-equisoft, hamid-cowlar, Joseph Hughes and lorraineliuu
We are experiencing the same issue with the latest node.js v20.9.0 version. Same for the 20.8.1 version.
The libuv seems to be the 1.46.0.
So, for now are there any workaround? Without considering an older version of node.
This looks like it was introduced in Node with the libuv@>=1.45.0 upgrade. It was introduced in Node 20.3.0 and Node 18.18.0.
It was reverted in Node 18.18.1 but never in 20.x 😢
Hey) Did you have a chance to find out the root cause of the problem that is in the libuv?
Node 18.18.1 reverts libuv change which is about importing io_uring and doesn't add it back again, but Node 20.x doesn't.
Using Axios to do parallel http requests has no this problem. I think it shouldn't be duty of Node or libuv. They are chaning, but Supertest doesn't.
We also experienced the same issue, although we found out the ECONNRESET happened to us when upgrading to Node20, in combination of calling supertest in a Promise.all array of promises.
Untangling the Promise.all call and awaiting individually, solved the problem for us.
This looks like it was introduced in Node with the libuv@>=1.45.0 upgrade. It was introduced in Node 20.3.0 and Node 18.18.0.
It was reverted in Node 18.18.1 but never in 20.x 😢
Hey) Did you have a chance to find out the root cause of the problem that is in the libuv?
Node 18.18.1 reverts libuv change which is about importing io_uring and doesn't add it back again, but Node 20.x doesn't. Using Axios to do parallel http requests has no this problem. I think it shouldn't be duty of Node or libuv. They are chaning, but Supertest doesn't.
Setting parallel fixed my issue, even though I was not using supertest, but got similar issue with cucumberjs
Somehow I've seen this issue resurface (without any environment changes I'm aware of) - though seems like it works up to 5 simultaneous connections instead of the reported 3 in the PR. Happy to debug further if there's any suggestions for where to look
Activity
jordancalder commentedon Mar 2, 2021
Any update here? I seem to be getting a similar error:
Dezzpil commentedon Mar 4, 2021
I wrote test to reproduce problem
There are may be different output in terminal after executions:
or
etc.
But i have no idea how to fix this :(
schw4rzlicht commentedon Mar 4, 2021
@Dezzpil thanks a lot! But I'm not quite sure if that directly relates to our problem, since we only see
ECONNRESETand neverECONNREFUSED:/lucasraziel commentedon Oct 2, 2021
same error with me. ECONNRESET is showing when running many tests, but It does not show when running the same test individually. In my case, I am not using Nest
cmwd commentedon Jan 4, 2022
It seems that when calling supertest many times in a concurrent manner this code https://github.com/visionmedia/supertest/blob/28116f9060c1904a433e7d69f1c14db32cf60279/lib/test.js#L61
will spin up multiple HTTP servers or start listening on multiple ports (?).
My solution is to call
app.getHttpServer().listen(0);after test app initialization in the beforeAll hook. This way the HTTP server can warm up and all supertest calls use the same address.So far worked fine for me. Hope that helps in your case as well.
niftylettuce commentedon Jan 4, 2022
Another issue that @shadowgate15 @spence-s and I found was that port 5000 is being used by AirPlay receiver on macOS Monterey via https://developer.apple.com/forums/thread/682332. I believe that @shadowgate15 is changing tests to use
get-portinstead to launch port for ZUUL / server.listen.simplenotezy commentedon Mar 30, 2022
Good find @niftylettuce - that might be it.
Perhaps we should find a solution to avoid using port 5000, if that is the case?
simplenotezy commentedon Mar 30, 2022
@niftylettuce I did try to disable AirPlay Receiver, but still getting random "Connection reset by peer"
shadowgate15 commentedon Mar 30, 2022
We need to fix the tests to use
beforeEachandafterEachto make sure the app is started on a random port and closes the app after the test.This issue should be reopened @niftylettuce.
shadowgate15 commentedon Mar 30, 2022
And assign it to me I'll fix it later on this week.
simplenotezy commentedon Aug 28, 2022
@shadowgate15 I believe the ticket was never reopened; however, still a relevant issue to tackle! 😊
titanism commentedon Aug 29, 2022
PR welcome
frbuceta commentedon Aug 3, 2023
This is happening to me with Node v20 only.
Look at the evidence of this PR loopbackio/loopback-next#9751.
What solutions can I adopt?
UPDATE:
It seems that removing the for and using es6 syntax works...
-> FOR TEST v20 https://github.com/loopbackio/loopback-next/actions/runs/5745322969/job/15573163172?pr=9751
-> ES6 TEST v20 https://github.com/loopbackio/loopback-next/actions/runs/5745513122/job/15573621754?pr=9751
8 remaining items
Drew-Kimberly commentedon Nov 2, 2023
This looks like it was introduced in Node with the
libuv@>=1.45.0upgrade. It was introduced in Node 20.3.0 and Node 18.18.0.It was reverted in Node 18.18.1 but never in 20.x 😢
luiof commentedon Nov 8, 2023
We are experiencing the same issue with the latest node.js v20.9.0 version. Same for the 20.8.1 version.
The libuv seems to be the 1.46.0.
So, for now are there any workaround? Without considering an older version of node.
eddyw commentedon Nov 8, 2023
What worked for us is:
I couldn't figure out the exact reason but I suspected it was attempting to start another server so providing a URI instead somehow just fixed it.
Hopefully it's useful for at least one person going through this difficult and painful time. 😅
test: fix ECONRESET for metric and history
aercolino-cognizant-cepsa commentedon Jan 30, 2024
Really upsetting.
To run my tests in Node.js 20.11.0, I had to replace
with
vbuzivskoy commentedon Feb 21, 2024
Hey) Did you have a chance to find out the root cause of the problem that is in the libuv?
zyf0330 commentedon Mar 5, 2024
Node 18.18.1 reverts libuv change which is about importing io_uring and doesn't add it back again, but Node 20.x doesn't.
Using Axios to do parallel http requests has no this problem. I think it shouldn't be duty of Node or libuv. They are chaning, but Supertest doesn't.
Marcosaurios commentedon May 2, 2024
We also experienced the same issue, although we found out the ECONNRESET happened to us when upgrading to Node20, in combination of calling supertest in a Promise.all array of promises.
Untangling the Promise.all call and awaiting individually, solved the problem for us.
nodify-at commentedon Jun 19, 2024
I encountered similar issues and resolved them by modifying the code as follows (node version: v20.14.0):
Before:
After:
It appears that passing the server to supertest instead of the app itself resolves the issue.
grumpy-huskie commentedon Dec 4, 2024
Setting parallel fixed my issue, even though I was not using supertest, but got similar issue with cucumberjs
fix: avoid server re-use race conditions
titanism commentedon Mar 20, 2025
v7.1.0 released to npm – please try it out and let us know if it works for you 🎉
https://github.com/ladjs/supertest/releases/tag/v7.1.0
Thank you for your contributions 🙏
Our efforts to maintain this project are through our work on https://forwardemail.net (@forwardemail)
luxaritas commentedon Mar 20, 2025
Looks like its resolved the issue for us - thank you!
luxaritas commentedon Jun 16, 2025
Somehow I've seen this issue resurface (without any environment changes I'm aware of) - though seems like it works up to 5 simultaneous connections instead of the reported 3 in the PR. Happy to debug further if there's any suggestions for where to look