Как я могу настроить koa-router для запуска общего кода перед любой из определенной группы маршрутов?

Я хотел бы добавить некоторые функции /module который выполняется для любого соответствующего маршрута в этом каталоге.

Итак, для заданного набора маршрутов:

/module/
/module/page
/module/things
/module/things/:thingid

Я хочу код в роутере для /module бежать по всем вышеперечисленным маршрутам. /module не отображает, он просто выбирает некоторые общие данные и настраивает контекст представления. Затем запускается один из других маршрутов и отображает страницу.

Это возможно с коа-роутером? Или есть лучшая упаковка?

Изменить: я думаю, может быть, мне нужно сделать вложенный маршрутизатор и добавить промежуточное программное обеспечение перед вложением следующим образом:

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 ответа

Вы можете использовать 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));

Мне нравится такой подход, потому что он стимулирует модульность.

Коа-роутер может сделать это, я думаю, лучше.

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

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

в этом примере каждый раз, когда маршрутизатор встречает '/module'. даже если в URL есть трейлинг или дополнительные параметры. он запустит первую функцию, а затем перейдет к любому условию удовлетворения.

Это ответ Рей Дьен, обновленный до 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...";
    });
Другие вопросы по тегам