我想向/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()
);似乎起作用了,但我不确定这是一个丑陋的黑客还是什么。如果有更好的方法,请给我建议。
发布于 2015-08-12 12:18:07
您可以考虑使用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));我喜欢这种方法,因为它鼓励模块化。
发布于 2015-08-12 20:57:55
koa-router可以做到这一点,我想更好。
router.use('/module/', function *(next) {
// code here
next();
});
router.get('/module/page', function *() {
this.body = 'your view';
});在此示例中,每次路由器遇到'/module‘。即使在url上有尾随的或附加的参数。它将运行第一个函数,然后继续执行任何满足条件。
发布于 2021-02-02 03:49:07
这是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...";
});https://stackoverflow.com/questions/31932060
复制相似问题