我想为/module
添加一些功能,以便为该目录下的任何匹配路由执行。
因此对于一组给定的路线:
/module/
/module/page
/module/things
/module/things/:thingid
我希望路由器中的代码/module
能够运行以上所有路由。 /module
无法呈现,它只是获取一些常见数据并配置视图上下文。然后其中一条路线运行并呈现页面。
koa-router有可能吗?还是有更好的包装?
编辑: 我想也许我必须做嵌套路由器并在嵌套之前添加中间件,如下所示:
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()
);
似乎工作正常,但我不确定这是一个丑陋的黑客还是什么。如果有更好的方法,请告知。
答案 0 :(得分:1)
您可以考虑使用koa-mount创建单独的应用,然后将其安装在/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));
我喜欢这种方法,因为它鼓励模块化。
答案 1 :(得分:0)
koa-router可以做到这一点,我想更好。
router.use('/module/', function *(next) {
// code here
next();
});
router.get('/module/page', function *() {
this.body = 'your view';
});
在此示例中,每次路由器遇到'/ module'时。即使网址上有尾随或附加的参数。它将运行第一个函数,然后进入任何满足条件。
答案 2 :(得分:0)
这是 Rei Dien 对 2021 年更新的回复。您也可以传递一组路线或 "/"
,它会在任何路线之前调用您的 router.use()
。路由数组示例:
router.use(["/user", "/posts"], async (ctx, next) => {
// Your code before routes...
await next();
});
router.get("/user/likes", async ctx => {
ctx.body = "Your rute code...";
});