首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将koa-router配置为在某一组路由之前运行公共代码?

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

Stack Overflow用户
提问于 2015-08-11 10:07:31
回答 3查看 1.6K关注 0票数 1

我想向/module添加一些功能,以便为该目录下的任何匹配路由执行这些功能。

因此,对于给定的一组路由:

代码语言:javascript
复制
/module/
/module/page
/module/things
/module/things/:thingid

我想在一个路由器的代码为/module运行的所有上述路线。/module不会渲染,它只是获取一些公共数据并配置视图上下文。然后,另一个路由运行并呈现该页面。

使用koa-router可以做到这点吗?还是有更好的套餐?

编辑:我想我可能不得不做一个嵌套的路由器,并在嵌套之前添加中间件,如下所示:

代码语言:javascript
复制
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()
);

似乎起作用了,但我不确定这是一个丑陋的黑客还是什么。如果有更好的方法,请给我建议。

EN

回答 3

Stack Overflow用户

发布于 2015-08-12 12:18:07

您可以考虑使用koa-mount创建一个单独的应用程序,然后在/module下挂载它。子应用程序可以有您喜欢的任何之前或之后的中间件。

代码语言:javascript
复制
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));

我喜欢这种方法,因为它鼓励模块化。

票数 2
EN

Stack Overflow用户

发布于 2015-08-12 20:57:55

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

代码语言:javascript
复制
router.use('/module/', function *(next) {
  // code here
  next();
});

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

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

票数 1
EN

Stack Overflow用户

发布于 2021-02-02 03:49:07

这是Rei Dien更新到2021年的回应。您还可以传递一个路由数组或"/",它们将在任何路由之前调用您的router.use()。路由数组示例:

代码语言:javascript
复制
    router.use(["/user", "/posts"], async (ctx, next) => {
        // Your code before routes...
        await next();
    });

    router.get("/user/likes", async ctx => {
        ctx.body = "Your rute code...";
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31932060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档