SuperTest: Listen at Random Port
In the example section of SuperTest (v0.15.0), it mentions something about ephemeral port:
You may pass an
http.Server
, or aFunction
torequest()
- if the server is not already listening for connections then it is bound to an ephemeral port for you so there is no need to keep track of ports. - https://github.com/visionmedia/supertest#example
Let’s dissect this sentence. There are a few key concepts to grasp:
- The
request
function will accept either a function or anhttp.Server
object. - When does the server not listening for connections?
- What is an ephemeral port?
Taking a peek at the index.js
file in SuperTest source code, it is easy to see that it accepts both function and http.Server
object, but prefer latter:
|
|
Why it does this? This has to do with Express:
|
|
Only when initiating an Express app, it returns a function, not an object. And follows up on lib/test.js
, when SuperTest detects the created server is yet to bind to any port number, it will invoke app.listen(0)
, so called ephemeral port. In fact, it is just a random port.
When something is ephemeral, it last for a very short time. When allowing a server to accept connections, we usually do is setting the server to listen on a specific port:
|
|
What if setting this to 0
like above or omit this port number?