如何configurationkoa-router在任何一组路由之前运行公共代码?

我想添加一些function/module ,获取该目录下的任何匹配路线执行。

所以对于一组给定的路线:

 /module/ /module/page /module/things /module/things/:thingid 

我想在/module路由器的代码在所有上述路线运行。 /module不渲染,它只是提取一些常见的数据并configuration视图上下文。 然后其他路线之一运行并呈现该页面。

这可能与koa路由器? 还是有更好的包装?

编辑:我想也许我必须做一个嵌套的路由器,并在嵌套之前添加中间件像这样:

 var subRouter = new Router(); subRouter.get('/', function *(next){ doSomething(); }); subRouter.get('/page', function *(next){ doSomething(); }); subRouter.get('/things', function *(next){ doSomething(); }); subRouter.get('/things/thingid', function *(next){ doSomething(); }); mainRouter.use('/module', function *(next) { doPreRouteSteps(); yield next; }, subRouter.routes() ); 

似乎工作,但我不知道这是一个丑陋的黑客或什么。 如果有更好的方法,请告知。

您可以考虑使用koa-mount创build一个单独的应用程序,然后将其安装在/module 。 子应用程序可以有任何你想要的前期或后期中间件。

 var mount = require('koa-mount'); var koa = require('koa'); var koaRouter = require('koa-router'); var subApp = koa(); var router = koaRouter(); router.get('/page', function *(next){ ... }); subApp.use(function*() { ...pre-route stuff... }); subApp.use(router.routes()); var mainApp = koa(); mainApp.use(mount('/module', subApp)); 

我喜欢这种方法,因为它鼓励模块化的方式。

koa路由器可以做到这一点,我想更好。

 router.use('/module/', function *(next) { // code here next(); }); router.get('/module/page', function *() { this.body = 'your view'; }); 

在这个示例中,每当路由器遇到“/模块”时。 即使url上有拖尾或附加参数。 它会运行第一个function,然后进入任何符合条件。