do-listen

1.0.3 • Public • Published

do-listen

Build Status Coverage Status

Properly call callback on a node server on the listening or error event.

Why?

I continue to see the following:

const http = require('http')
const server = http.createServer()
server.listen((err) => { // `err` won't be passed here
  if (err) throw err
})

The problem with that is that the cb passed to the listen function is only added as an event listener for the listening event.

i.e. no err will ever be passed back.

In order to properly wait for either the listening event or error event without leaking listeners:

function doListen(server, cb) {
  var called = false
  const done = (err) => {
    if (called) return
    server.removeListener('error', done)
    server.removeListener('listening', done)
    called = true
    cb(err)
  }

  server.on('error', done)
  server.on('listening', done)
}

which is literally what the package is :]

Install

$ npm install do-listen

Examples

'use strict'

const net = require('net')
const doListen = require('do-listen')

const server = net.createServer()
server.listen(0)
doListen(server, (err) => {
  if (err) throw err
  console.log('listening on', server.address().port)
})

This also works with http

'use strict'

const http = require('http')
const doListen = require('do-listen')

const server = http.createServer()
server.listen(8080)
doListen(server, (err) => {
  if (err) throw err
  console.log('listening on', server.address().port)
})

Want to use with promises or async/await?

'use strict'

const http = require('http')
const {promisify} = require('util')
const doListen = require('do-listen')

const server = http.createServer()
server.listen(8080)
async function main() {
  await doListen(server)
}

// or

'use strict'

const http = require('http')
const {promisify} = require('util')
const doListen = require('do-listen')

const server = http.createServer()
server.listen(8080)
doListen(server).then(() => {
  console.log('listening on', server.address().port)
}).catch((err) => {
  throw err
})

Test

$ npm test

Author

Evan Lucas

License

MIT (See LICENSE for more info)

Readme

Keywords

none

Package Sidebar

Install

npm i do-listen

Weekly Downloads

1

Version

1.0.3

License

MIT

Last publish

Collaborators

  • evanlucas