Как я могу настроить 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...";
});