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

时间:2015-08-11 02:07:31

标签: node.js koa koa-router

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

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

3 个答案:

答案 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...";
    });