From abb7e8192e12668c0241285ac3a553414a6b59b3 Mon Sep 17 00:00:00 2001 From: Li Xiao-Bo Date: Sun, 17 May 2020 18:49:47 +0800 Subject: [PATCH] fix #151 Wildcard route should not be blocked by Parametric with different method --- node.js | 14 +++++++++-- test/issue-151.test.js | 55 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 test/issue-151.test.js diff --git a/node.js b/node.js index 5981104..a38088c 100644 --- a/node.js +++ b/node.js @@ -122,7 +122,12 @@ Node.prototype.findChild = function (path, method) { } } - child = this.children[':'] || this.children['*'] + child = this.children[':'] + if (child !== undefined && (child.numberOfChildren > 0 || child.handlers[method] !== null)) { + return child + } + + child = this.children['*'] if (child !== undefined && (child.numberOfChildren > 0 || child.handlers[method] !== null)) { return child } @@ -138,7 +143,12 @@ Node.prototype.findVersionChild = function (version, path, method) { } } - child = this.children[':'] || this.children['*'] + child = this.children[':'] + if (child !== undefined && (child.numberOfChildren > 0 || child.getVersionHandler(version, method) !== null)) { + return child + } + + child = this.children['*'] if (child !== undefined && (child.numberOfChildren > 0 || child.getVersionHandler(version, method) !== null)) { return child } diff --git a/test/issue-151.test.js b/test/issue-151.test.js new file mode 100644 index 0000000..2725486 --- /dev/null +++ b/test/issue-151.test.js @@ -0,0 +1,55 @@ +'use strict' + +const t = require('tap') +const test = t.test +const FindMyWay = require('../') + +test('Wildcard route should not be blocked by Parametric with different method / 1', t => { + t.plan(1) + const findMyWay = FindMyWay({ + defaultRoute: (req, res) => { + t.fail('Should not be defaultRoute') + } + }) + + findMyWay.on('OPTIONS', '/*', (req, res, params) => { + t.fail('Should not be here') + }) + + findMyWay.on('OPTIONS', '/obj/*', (req, res, params) => { + t.strictEqual(req.method, 'OPTIONS') + }) + + findMyWay.on('GET', '/obj/:id', (req, res, params) => { + t.fail('Should not be GET') + }) + + findMyWay.lookup({ method: 'OPTIONS', url: '/obj/params', headers: {} }, null) +}) + +test('Wildcard route should not be blocked by Parametric with different method / 2', t => { + t.plan(1) + const findMyWay = FindMyWay({ + defaultRoute: (req, res) => { + t.fail('Should not be defaultRoute') + } + }) + + findMyWay.on('OPTIONS', '/*', { version: '1.2.3' }, (req, res, params) => { + t.fail('Should not be here') + }) + + findMyWay.on('OPTIONS', '/obj/*', { version: '1.2.3' }, (req, res, params) => { + t.strictEqual(req.method, 'OPTIONS') + }) + + findMyWay.on('GET', '/obj/:id', { version: '1.2.3' }, (req, res, params) => { + t.fail('Should not be GET') + }) + + findMyWay.lookup({ + method: 'OPTIONS', + url: '/obj/params', + headers: { 'accept-version': '1.2.3' } + }, null) +})