Skip to content

Commit 9722202

Browse files
blakeembreydougwilson
authored andcommitted
Add next("router") to exit from router
closes #2241 closes #2371
1 parent 51f5290 commit 9722202

File tree

4 files changed

+44
-0
lines changed

4 files changed

+44
-0
lines changed

History.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ unreleased
22
==========
33

44
* Add debug message when loading view engine
5+
* Add `next("router")` to exit from router
56
* Fix case where `router.use` skipped requests routes did not
67
* Remove usage of `res._headers` private field
78
- Improves compatibility with Node.js 8 nightly

lib/router/index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,12 @@ proto.handle = function handle(req, res, out) {
191191
removed = '';
192192
}
193193

194+
// signal to exit router
195+
if (layerError === 'router') {
196+
setImmediate(done, null)
197+
return
198+
}
199+
194200
// no more matching layers
195201
if (idx >= stack.length) {
196202
setImmediate(done, layerError);

lib/router/route.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,16 @@ Route.prototype.dispatch = function dispatch(req, res, done) {
112112
next();
113113

114114
function next(err) {
115+
// signal to exit route
115116
if (err && err === 'route') {
116117
return done();
117118
}
118119

120+
// signal to exit router
121+
if (err && err === 'router') {
122+
return done(err)
123+
}
124+
119125
var layer = stack[idx++];
120126
if (!layer) {
121127
return done(err);

test/app.router.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -932,6 +932,37 @@ describe('app.router', function(){
932932
})
933933
})
934934

935+
describe('when next("router") is called', function () {
936+
it('should jump out of router', function (done) {
937+
var app = express()
938+
var router = express.Router()
939+
940+
function fn (req, res, next) {
941+
res.set('X-Hit', '1')
942+
next('router')
943+
}
944+
945+
router.get('/foo', fn, function (req, res, next) {
946+
res.end('failure')
947+
})
948+
949+
router.get('/foo', function (req, res, next) {
950+
res.end('failure')
951+
})
952+
953+
app.use(router)
954+
955+
app.get('/foo', function (req, res) {
956+
res.end('success')
957+
})
958+
959+
request(app)
960+
.get('/foo')
961+
.expect('X-Hit', '1')
962+
.expect(200, 'success', done)
963+
})
964+
})
965+
935966
describe('when next(err) is called', function(){
936967
it('should break out of app.router', function(done){
937968
var app = express()

0 commit comments

Comments
 (0)