parent
4c0f1f53d3
commit
739586f96a
@ -1,6 +1,7 @@
|
||||
unreleased
|
||||
==========
|
||||
|
||||
* add `req.baseUrl` to access the path stripped from `req.url` in routes
|
||||
* fix behavior of multiple `app.VERB` for the same path
|
||||
* fix issue routing requests among sub routers
|
||||
* invoke `router.param()` only when necessary instead of every match
|
||||
|
@ -131,9 +131,11 @@ proto.handle = function(req, res, done) {
|
||||
// middleware and routes
|
||||
var stack = self.stack;
|
||||
|
||||
// request-level next
|
||||
// manage inter-router variables
|
||||
var parent = req.next;
|
||||
var parentUrl = req.baseUrl || '';
|
||||
done = wrap(done, function(old, err) {
|
||||
req.baseUrl = parentUrl;
|
||||
req.next = parent;
|
||||
old(err);
|
||||
});
|
||||
@ -168,6 +170,7 @@ proto.handle = function(req, res, done) {
|
||||
slashAdded = false;
|
||||
}
|
||||
|
||||
req.baseUrl = parentUrl;
|
||||
req.url = protohost + removed + req.url.substr(protohost.length);
|
||||
req.originalUrl = req.originalUrl || req.url;
|
||||
removed = '';
|
||||
@ -228,11 +231,18 @@ proto.handle = function(req, res, done) {
|
||||
req.url = protohost + req.url.substr(protohost.length + removed.length);
|
||||
|
||||
// Ensure leading slash
|
||||
if (!fqdn && '/' != req.url[0]) {
|
||||
if (!fqdn && req.url[0] !== '/') {
|
||||
req.url = '/' + req.url;
|
||||
slashAdded = true;
|
||||
}
|
||||
|
||||
// Setup base URL (no trailing slash)
|
||||
if (removed.length && removed.substr(-1) === '/') {
|
||||
req.baseUrl = parentUrl + removed.substring(0, removed.length - 1);
|
||||
} else {
|
||||
req.baseUrl = parentUrl + removed;
|
||||
}
|
||||
|
||||
debug('%s %s : %s', layer.handle.name || 'anonymous', layerPath, req.originalUrl);
|
||||
var arity = layer.handle.length;
|
||||
if (err) {
|
||||
|
87
test/req.baseUrl.js
Normal file
87
test/req.baseUrl.js
Normal file
@ -0,0 +1,87 @@
|
||||
|
||||
var express = require('..')
|
||||
var request = require('supertest')
|
||||
|
||||
describe('req', function(){
|
||||
describe('.baseUrl', function(){
|
||||
it('should be empty for top-level route', function(done){
|
||||
var app = express()
|
||||
|
||||
app.get('/:a', function(req, res){
|
||||
res.end(req.baseUrl)
|
||||
})
|
||||
|
||||
request(app)
|
||||
.get('/foo')
|
||||
.expect(200, '', done)
|
||||
})
|
||||
|
||||
it('should contain lower path', function(done){
|
||||
var app = express()
|
||||
var sub = express.Router()
|
||||
|
||||
sub.get('/:b', function(req, res){
|
||||
res.end(req.baseUrl)
|
||||
})
|
||||
app.use('/:a', sub)
|
||||
|
||||
request(app)
|
||||
.get('/foo/bar')
|
||||
.expect(200, '/foo', done);
|
||||
})
|
||||
|
||||
it('should contain full lower path', function(done){
|
||||
var app = express()
|
||||
var sub1 = express.Router()
|
||||
var sub2 = express.Router()
|
||||
var sub3 = express.Router()
|
||||
|
||||
sub3.get('/:d', function(req, res){
|
||||
res.end(req.baseUrl)
|
||||
})
|
||||
sub2.use('/:c', sub3)
|
||||
sub1.use('/:b', sub2)
|
||||
app.use('/:a', sub1)
|
||||
|
||||
request(app)
|
||||
.get('/foo/bar/baz/zed')
|
||||
.expect(200, '/foo/bar/baz', done);
|
||||
})
|
||||
|
||||
it('should travel through routers correctly', function(done){
|
||||
var urls = []
|
||||
var app = express()
|
||||
var sub1 = express.Router()
|
||||
var sub2 = express.Router()
|
||||
var sub3 = express.Router()
|
||||
|
||||
sub3.get('/:d', function(req, res, next){
|
||||
urls.push('0@' + req.baseUrl)
|
||||
next()
|
||||
})
|
||||
sub2.use('/:c', sub3)
|
||||
sub1.use('/', function(req, res, next){
|
||||
urls.push('1@' + req.baseUrl)
|
||||
next()
|
||||
})
|
||||
sub1.use('/bar', sub2)
|
||||
sub1.use('/bar', function(req, res, next){
|
||||
urls.push('2@' + req.baseUrl)
|
||||
next()
|
||||
})
|
||||
app.use(function(req, res, next){
|
||||
urls.push('3@' + req.baseUrl)
|
||||
next()
|
||||
})
|
||||
app.use('/:a', sub1)
|
||||
app.use(function(req, res, next){
|
||||
urls.push('4@' + req.baseUrl)
|
||||
res.end(urls.join(','))
|
||||
})
|
||||
|
||||
request(app)
|
||||
.get('/foo/bar/baz/zed')
|
||||
.expect(200, '3@,1@/foo,0@/foo/bar/baz,2@/foo/bar,4@', done);
|
||||
})
|
||||
})
|
||||
})
|
Loading…
Reference in New Issue
Block a user