如何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,然后进入任何符合条件。