From 1c81b3bcb8deb1aa9e328cedded29e415aabbc42 Mon Sep 17 00:00:00 2001 From: Guillaume Sabran Date: Thu, 14 Jul 2016 19:19:16 -0700 Subject: [PATCH 1/4] run middleware after route hit only --- lib/implementation.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/implementation.js b/lib/implementation.js index 194f10c..9d7a02a 100644 --- a/lib/implementation.js +++ b/lib/implementation.js @@ -11,6 +11,9 @@ PickerImp = function(filterFunction) { PickerImp.prototype.middleware = function(callback) { this.middlewares.push(callback); + for(const subRouter of this.subRouters) { + subRouter.middleware(callback); + } }; PickerImp.prototype.route = function(path, callback) { @@ -23,6 +26,9 @@ PickerImp.prototype.route = function(path, callback) { PickerImp.prototype.filter = function(callback) { var subRouter = new PickerImp(callback); this.subRouters.push(subRouter); + for(const middleware of this.middlewares) { + subRouter.middleware(middleware); + } return subRouter; }; @@ -39,13 +45,10 @@ PickerImp.prototype._dispatch = function(req, res, bypass) { } } - processNextMiddleware(); function processNextMiddleware () { var middleware = self.middlewares[currentMiddleware++]; if(middleware) { self._processMiddleware(middleware, req, res, processNextMiddleware); - } else { - processNextRoute(); } } @@ -54,7 +57,8 @@ PickerImp.prototype._dispatch = function(req, res, bypass) { if(route) { var uri = req.url.replace(/\?.*/, ''); var m = uri.match(route); - if(m) { + if (m) { + processNextMiddleware(); var params = self._buildParams(route.keys, m); params.query = urlParse(req.url, true).query; self._processRoute(route.callback, params, req, res, bypass); @@ -65,6 +69,7 @@ PickerImp.prototype._dispatch = function(req, res, bypass) { processNextSubRouter(); } } + processNextRoute(); function processNextSubRouter () { var subRouter = self.subRouters[currentSubRouter++]; From 1bf8b9dd390749c8be7a89c5412eb2be81ece4af Mon Sep 17 00:00:00 2001 From: Guillaume Sabran Date: Thu, 14 Jul 2016 19:27:27 -0700 Subject: [PATCH 2/4] add missing ecmascript dependency --- package.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.js b/package.js index 35f70f2..b7042fc 100644 --- a/package.js +++ b/package.js @@ -27,7 +27,7 @@ function configurePackage(api) { api.versionsFrom('METEOR@1.2'); } - api.use(['webapp', 'underscore'], ['server']); + api.use(['webapp', 'underscore', 'ecmascript'], ['server']); api.addFiles([ 'lib/implementation.js', 'lib/instance.js', From cbd08589da995f7a6f5c243ee4b48f464159bac3 Mon Sep 17 00:00:00 2001 From: Guillaume Sabran Date: Fri, 15 Jul 2016 12:01:26 -0700 Subject: [PATCH 3/4] fix issue with asynchronous middleware --- lib/implementation.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/implementation.js b/lib/implementation.js index 9d7a02a..28cd320 100644 --- a/lib/implementation.js +++ b/lib/implementation.js @@ -45,10 +45,10 @@ PickerImp.prototype._dispatch = function(req, res, bypass) { } } - function processNextMiddleware () { + function processNextMiddleware (onDone) { var middleware = self.middlewares[currentMiddleware++]; if(middleware) { - self._processMiddleware(middleware, req, res, processNextMiddleware); + self._processMiddleware(middleware, req, res, () => { processNextMiddleware(onDone); }); } } @@ -58,10 +58,11 @@ PickerImp.prototype._dispatch = function(req, res, bypass) { var uri = req.url.replace(/\?.*/, ''); var m = uri.match(route); if (m) { - processNextMiddleware(); - var params = self._buildParams(route.keys, m); - params.query = urlParse(req.url, true).query; - self._processRoute(route.callback, params, req, res, bypass); + processNextMiddleware(() => { + var params = self._buildParams(route.keys, m); + params.query = urlParse(req.url, true).query; + self._processRoute(route.callback, params, req, res, bypass); + }); } else { processNextRoute(); } From 6d5721da0a6b1700938792cde3bba3100d7790e7 Mon Sep 17 00:00:00 2001 From: Guillaume Sabran Date: Fri, 15 Jul 2016 12:11:37 -0700 Subject: [PATCH 4/4] fix issue and add test --- lib/implementation.js | 2 ++ test/instance.js | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/lib/implementation.js b/lib/implementation.js index 28cd320..6eed57c 100644 --- a/lib/implementation.js +++ b/lib/implementation.js @@ -49,6 +49,8 @@ PickerImp.prototype._dispatch = function(req, res, bypass) { var middleware = self.middlewares[currentMiddleware++]; if(middleware) { self._processMiddleware(middleware, req, res, () => { processNextMiddleware(onDone); }); + } else { + onDone(); } } diff --git a/test/instance.js b/test/instance.js index 733bbe7..da1db4b 100644 --- a/test/instance.js +++ b/test/instance.js @@ -87,6 +87,40 @@ Tinytest.add('middlewares - with filtered routes', function(test) { test.equal(res.content, "ok"); }); +Tinytest.add('middlewares - with several filtered routes', function(test) { + var path1 = "/" + Random.id() + "/coola"; + var path2 = "/" + Random.id() + "/coola"; + + var routes1 = Picker.filter(); + var routes2 = Picker.filter(); + + const increaseResultBy = (i) => (req, res, next) => { + setTimeout(function() { + req.result = req.result || 0; + req.result += i; + next(); + }, 100); + }; + + routes1.middleware(increaseResultBy(1)); + routes2.middleware(increaseResultBy(2)); + + Picker.middleware(increaseResultBy(10)); + + routes1.route(path1, function(params, req, res) { + res.end(req.result+''); + }); + routes2.route(path2, function(params, req, res) { + res.end(req.result+''); + }); + + var res = HTTP.get(getPath(path1)); + test.equal(res.content, "11"); + + var res = HTTP.get(getPath(path2)); + test.equal(res.content, "12"); +}); + var urlResolve = Npm.require('url').resolve; function getPath(path) { return urlResolve(process.env.ROOT_URL, path);