Skip to content

Commit ee40a88

Browse files
committed
call callback once on listen error
1 parent 26801a0 commit ee40a88

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

lib/application.js

+10-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ var compileTrust = require('./utils').compileTrust;
2424
var flatten = require('array-flatten').flatten
2525
var merge = require('utils-merge');
2626
var resolve = require('path').resolve;
27+
var once = require('once')
2728
var Router = require('router');
2829
var setPrototypeOf = require('setprototypeof')
2930

@@ -605,10 +606,15 @@ app.render = function render(name, options, callback) {
605606
* @public
606607
*/
607608

608-
app.listen = function listen() {
609-
var server = http.createServer(this);
610-
return server.listen.apply(server, arguments);
611-
};
609+
app.listen = function listen () {
610+
var server = http.createServer(this)
611+
var args = Array.prototype.slice.call(arguments)
612+
if (typeof args[args.length - 1] === 'function') {
613+
var done = args[args.length - 1] = once(args[args.length - 1])
614+
server.once('error', done)
615+
}
616+
return server.listen.apply(server, args)
617+
}
612618

613619
/**
614620
* Log error using console.error.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"methods": "~1.1.2",
4848
"mime-types": "~2.1.34",
4949
"on-finished": "2.4.1",
50+
"once": "1.4.0",
5051
"parseurl": "~1.3.3",
5152
"path-is-absolute": "1.0.1",
5253
"proxy-addr": "~2.0.7",

test/app.listen.js

+14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict'
22

33
var express = require('../')
4+
var assert = require('assert')
45

56
describe('app.listen()', function(){
67
it('should wrap with an HTTP server', function(done){
@@ -10,4 +11,17 @@ describe('app.listen()', function(){
1011
server.close(done)
1112
});
1213
})
14+
it('should callback on HTTP server errors', function (done) {
15+
var app1 = express()
16+
var app2 = express()
17+
18+
var server1 = app1.listen(0, function (err) {
19+
assert(!err)
20+
app2.listen(server1.address().port, function (err) {
21+
assert(err.code === 'EADDRINUSE')
22+
server1.close()
23+
done()
24+
})
25+
})
26+
})
1327
})

0 commit comments

Comments
 (0)