diff --git a/index.js b/index.js index 21297bc..97002bf 100644 --- a/index.js +++ b/index.js @@ -115,7 +115,7 @@ Router.prototype.on = function on (method, path, opts, handler, store) { assert(path.length === optionalParamMatch.index + optionalParamMatch[0].length, 'Optional Parameter needs to be the last parameter of the path') const pathFull = path.replace(OPTIONAL_PARAM_REGEXP, '$1$2') - const pathOptional = path.replace(OPTIONAL_PARAM_REGEXP, '$2') + const pathOptional = path.replace(OPTIONAL_PARAM_REGEXP, '$2') || '/' this.on(method, pathFull, opts, handler, store) this.on(method, pathOptional, opts, handler, store) diff --git a/test/optional-params.test.js b/test/optional-params.test.js index 2d9c8eb..c1534ba 100644 --- a/test/optional-params.test.js +++ b/test/optional-params.test.js @@ -195,3 +195,23 @@ test('deregister a route with optional param', (t) => { t.notOk(findMyWay.find('GET', '/a/:param/b')) t.notOk(findMyWay.find('GET', '/a/:param/b/:optional')) }) + +test('optional parameter on root', (t) => { + t.plan(2) + const findMyWay = FindMyWay({ + defaultRoute: (req, res) => { + t.fail('Should not be defaultRoute') + } + }) + + findMyWay.on('GET', '/:optional?', (req, res, params) => { + if (params.optional) { + t.equal(params.optional, 'foo') + } else { + t.equal(params.optional, undefined) + } + }) + + findMyWay.lookup({ method: 'GET', url: '/', headers: {} }, null) + findMyWay.lookup({ method: 'GET', url: '/foo', headers: {} }, null) +})