Получить сопоставленные параметры маршрута в промежуточном программном обеспечении для всех маршрутов Koa-router

Я пишу библиотеку, которая добавляет проверку ко всем маршрутам для использования с koa-router.

В моем файле routes/index.js перед запуском каких-либо маршрутов я могу получить большую часть того, чего хочу, используя следующий код:

    let routePath = ctx._matchedRoute as string;

    if (!routePath) {
        return next();
    }

    // Strip trailing slash and replace colon with underscore
    let routeName = routePath.replace(/\/$/, "").replace(/:/g, "_");
    let schemaName = `/requests/${ctx.method}${routeName}.json`;

    if (!hasSchema(schemaName)) {
        return next();
    }

    try {
        await validate(schemaName, {
            query: ctx.query,
            params: ctx.params,
            body: ctx.request.body,
            headers: ctx.headers
        });

        return next();
    } catch (err) {
        throw err;
    }

К сожалению, ctx.params, по-видимому, заполняется только «вниз по течению», то есть на уровне обработчика маршрута, который должен быть выполнен. Я хотел бы получить доступ к этим параметрам без необходимости определять свое промежуточное ПО перед каждым обработчиком маршрута. Есть ли способ добиться этого?


person Ruben Rutten    schedule 19.04.2020    source источник


Ответы (1)


В основном у вас есть 2 варианта:

  1. Используйте те же библиотеки, которые koa-route использует для анализа маршрута и извлечения этих параметров из URL-адресов.
  2. Оберните koa-route собственным промежуточным ПО, чтобы у вас была возможность быть первым промежуточным ПО, вызываемым после koa-route, а затем вызвать обычное промежуточное ПО пост-маршрутизации.

Оба варианта я считаю допустимыми. Если производительность очень важна, вы, вероятно, получите немного больше о варианте 2, так как вам не нужно дважды анализировать маршруты.

person Evert    schedule 19.04.2020
comment
Я думал написать свой собственный класс Router, который не делает ничего, кроме добавления моего промежуточного программного обеспечения до того, как ему будет передано arguments. Я не был уверен, есть ли лучший способ - person Ruben Rutten; 19.04.2020
comment
Промежуточное программное обеспечение @RubenRutten koa - это просто простые функции. Koa-router — это просто промежуточное ПО, которое может вызывать другие промежуточные ПО. В мире коа имеет смысл не предоставлять причудливый API для такого рода вещей, учитывая, что все примитивы легко справляются с этим. Класс, вероятно, излишен, если вам действительно не нужно состояние. - person Evert; 19.04.2020
comment
Я добавлю к этому ответу небольшой пример, демонстрирующий это. - person Evert; 19.04.2020
comment
Причина, по которой я хотел бы написать класс, заключается в том, что я могу предоставить замену для всех моих текущих маршрутизаторов. Замена import * as Router from "koa-router"; на import Router from "./my-own-router";, предоставление того же API, только обертывание исходного маршрутизатора и добавление моего промежуточного программного обеспечения в цепочку. - person Ruben Rutten; 19.04.2020
comment
Я вижу, вы не используете официальный маршрутизатор koa. Похоже, что класс может быть выходом тогда. - person Evert; 19.04.2020
comment
Теперь я вижу, что koa-router невероятно неактивен, а @koa/router — это вилка, которая на самом деле поддерживается. Я посмотрю, смогу ли я переключиться и как это повлияет на то, чего я пытаюсь достичь. - person Ruben Rutten; 19.04.2020