diff --git a/lib/application.js b/lib/application.js index f07cc12a41..43c9f34b06 100644 --- a/lib/application.js +++ b/lib/application.js @@ -24,6 +24,7 @@ var compileTrust = require('./utils').compileTrust; var flatten = require('array-flatten').flatten var merge = require('utils-merge'); var resolve = require('path').resolve; +var once = require('once') var Router = require('router'); var setPrototypeOf = require('setprototypeof') @@ -605,10 +606,15 @@ app.render = function render(name, options, callback) { * @public */ -app.listen = function listen() { - var server = http.createServer(this); - return server.listen.apply(server, arguments); -}; +app.listen = function listen () { + var server = http.createServer(this) + var args = Array.prototype.slice.call(arguments) + if (typeof args[args.length - 1] === 'function') { + var done = args[args.length - 1] = once(args[args.length - 1]) + server.once('error', done) + } + return server.listen.apply(server, args) +} /** * Log error using console.error. diff --git a/package.json b/package.json index 5a8f978e1c..d3e2f0a190 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "methods": "~1.1.2", "mime-types": "~2.1.34", "on-finished": "2.4.1", + "once": "1.4.0", "parseurl": "~1.3.3", "path-is-absolute": "1.0.1", "proxy-addr": "~2.0.7", diff --git a/test/app.listen.js b/test/app.listen.js index 5b150063b9..7e7e731a3b 100644 --- a/test/app.listen.js +++ b/test/app.listen.js @@ -1,6 +1,7 @@ 'use strict' var express = require('../') +var assert = require('assert') describe('app.listen()', function(){ it('should wrap with an HTTP server', function(done){ @@ -10,4 +11,17 @@ describe('app.listen()', function(){ server.close(done) }); }) + it('should callback on HTTP server errors', function (done) { + var app1 = express() + var app2 = express() + + var server1 = app1.listen(0, function (err) { + assert(!err) + app2.listen(server1.address().port, function (err) { + assert(err.code === 'EADDRINUSE') + server1.close() + done() + }) + }) + }) })