Как я могу вставить промежуточное ПО для проверки маршрута в Cro?

Скажем, мне нужно проверить какой-то URI, прежде чем я подам какой-то результат. Я могу сделать что-то вроде этого:

sub type-routes {
    route {
        get -> Str $type where $type ∈ @food-types {
            my %ingredients-table = $rrr.calories-table;
            my @result =  %ingredients-table.keys.grep: {
                %ingredients-table{$_}{$type} };
            content 'application/json', @result;
        }
        get -> Str $type where $type ∉ @food-types {
            not-found;
        }
    }
}

По сути, разные сигнатуры для существующих и несуществующих продуктов в этом случае. Однако тот же URI будет использоваться на всех маршрутах. Было бы интересно иметь возможность проверить его до сопоставления любого маршрута, чтобы, когда он достигнет блока маршрута, мы знали, что все в порядке. Таким образом, его можно было повторно использовать на разных маршрутах.

Я проверил before и before-match, и, очевидно, вы можете это сделать, но вам нужно проанализировать объект запроса, чтобы добраться до него, нет простого способа сделать это.

В качестве альтернативы, существует ли способ определения «запасного маршрута», чтобы, если URI не был найден, возвращался не найденный?


person jjmerelo    schedule 12.05.2020    source источник


Ответы (1)


Прежде чем давать ответ по промежуточному программному обеспечению, я в первую очередь прибегаю к подобным ситуациям, как правило, к типу subset:

sub type-routes {
    route {
        my constant @food-types = <burgers pizzas beer>;
        my subset Food of Str where { $^type ∈ @food-types }

        get -> Food $type {
            my %ingredients-table = $rrr.calories-table;
            my @result =  %ingredients-table.keys.grep: {
                %ingredients-table{$_}{$type} };
            content 'application/json', @result;
        }
    }
}

Таким образом, Food можно использовать на любом количестве маршрутов. Нет необходимости в резервном маршруте (ни в этом решении, ни в исходном вопросе) для создания not-found, потому что маршрутизатор автоматически создает это, когда ни один маршрут в любом случае не соответствует сегментам пути.

Однако, если вы хотите пойти по пути промежуточного программного обеспечения, то самый простой подход - получить path-segments из request и сравнить его с соответствующей частью:

sub type-routes {
    route {
        my constant @food-types = <burgers pizzas beer>;
        before {
            not-found unless request.path-segments[0] ∈ @food-types;
        }

        get -> Str $type {
            content 'application/json', <123 456>;
        }
    }
}
person Jonathan Worthington    schedule 12.05.2020