1

我想/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()
);

似乎正在工作,但我不确定这是一个丑陋的黑客还是什么。如果有更好的方法,请指教。

4

3 回答 3

2

您可以考虑使用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-12T04:18:07.383 回答
1

koa-router 可以做到这一点,我想更好。

router.use('/module/', function *(next) {
  // code here
  next();
});

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

在此示例中,每次路由器遇到“/模块”时。即使 url 上有尾随或附加参数。它将运行第一个函数,然后继续满足任何条件。

于 2015-08-12T12:57:54.983 回答
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...";
    });
于 2021-02-01T19:49:06.990 回答