Skip to content

Commit fb2d918

Browse files
committed
fix handling of errors from param callbacks
fixes #2149
1 parent dfefea5 commit fb2d918

File tree

3 files changed

+44
-2
lines changed

3 files changed

+44
-2
lines changed

History.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
unreleased
2+
==========
3+
4+
* fix handling of errors from `router.param()` callbacks
5+
16
4.3.1 / 2014-05-23
27
==================
38

lib/router/index.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ proto.process_params = function(layer, called, req, res, done) {
290290
var key;
291291
var paramVal;
292292
var paramCallbacks;
293+
var paramCalled;
293294

294295
// process params in order
295296
// param callbacks can be async
@@ -312,12 +313,18 @@ proto.process_params = function(layer, called, req, res, done) {
312313
name = key.name;
313314
paramVal = req.params[name];
314315
paramCallbacks = params[name];
316+
paramCalled = called[name];
315317

316-
if (paramVal === undefined || !paramCallbacks || called[name] === paramVal) {
318+
if (paramVal === undefined || !paramCallbacks) {
317319
return param();
318320
}
319321

320-
called[name] = paramVal;
322+
// param previously called with same value or error occurred
323+
if (paramCalled && (paramCalled.err || paramCalled.val === paramVal)) {
324+
return param(paramCalled.err);
325+
}
326+
327+
called[name] = paramCalled = { val: paramVal };
321328

322329
try {
323330
return paramCallback();
@@ -328,6 +335,11 @@ proto.process_params = function(layer, called, req, res, done) {
328335

329336
// single param callbacks
330337
function paramCallback(err) {
338+
if (err && paramCalled) {
339+
// store error
340+
paramCalled.err = err;
341+
}
342+
331343
var fn = paramCallbacks[paramIndex++];
332344
if (err || !fn) return param(err);
333345
fn(req, res, paramCallback, paramVal, key.name);

test/app.param.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,5 +194,30 @@ describe('app', function(){
194194
.get('/user/123')
195195
.expect('name', done);
196196
})
197+
198+
it('should defer all the param routes', function(done){
199+
var app = express();
200+
201+
app.param('id', function(req, res, next, val){
202+
if (val === 'new') return next('route');
203+
return next();
204+
});
205+
206+
app.all('/user/:id', function(req, res){
207+
res.send('all.id');
208+
});
209+
210+
app.get('/user/:id', function(req, res){
211+
res.send('get.id');
212+
});
213+
214+
app.get('/user/new', function(req, res){
215+
res.send('get.new');
216+
});
217+
218+
request(app)
219+
.get('/user/new')
220+
.expect('get.new', done);
221+
})
197222
})
198223
})

0 commit comments

Comments
 (0)