Skip to content

Commit cf5ce72

Browse files
committed
call callback once on listen error
1 parent c8d9223 commit cf5ce72

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
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');
2525
var merge = require('utils-merge');
2626
var resolve = require('path').resolve;
27+
var once = require('once')
2728
var Router = require('router');
2829
var slice = Array.prototype.slice;
2930

@@ -598,10 +599,15 @@ app.render = function render(name, options, callback) {
598599
* @public
599600
*/
600601

601-
app.listen = function listen() {
602-
var server = http.createServer(this);
603-
return server.listen.apply(server, arguments);
604-
};
602+
app.listen = function listen () {
603+
var server = http.createServer(this)
604+
var args = Array.prototype.slice.call(arguments)
605+
if (typeof args[args.length - 1] === 'function') {
606+
var done = args[args.length - 1] = once(args[args.length - 1])
607+
server.once('error', done)
608+
}
609+
return server.listen.apply(server, args)
610+
}
605611

606612
/**
607613
* Log error using console.error.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"merge-descriptors": "1.0.1",
4444
"methods": "~1.1.2",
4545
"on-finished": "~2.3.0",
46+
"once": "1.4.0",
4647
"parseurl": "~1.3.1",
4748
"path-is-absolute": "1.0.1",
4849
"path-to-regexp": "0.1.7",

test/app.listen.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
var express = require('../')
3-
, request = require('supertest');
3+
var assert = require('assert')
4+
var request = require('supertest')
45

56
describe('app.listen()', function(){
67
it('should wrap with an HTTP server', function(done){
@@ -15,4 +16,17 @@ describe('app.listen()', function(){
1516
done();
1617
});
1718
})
19+
it('should callback on HTTP server errors', function (done) {
20+
var app1 = express()
21+
var app2 = express()
22+
23+
var server1 = app1.listen(0, function (err) {
24+
assert(!err)
25+
var server2 = app2.listen(server1.address().port, function (err) {
26+
assert(err.code === 'EADDRINUSE')
27+
server1.close()
28+
done()
29+
})
30+
})
31+
})
1832
})

0 commit comments

Comments
 (0)