Perl Ошибка маршрута по умолчанию для Dancer2 - PullRequest
2 голосов
/ 21 января 2020

Я хочу, чтобы по умолчанию не было perl танцоров 404 «Извините, это пустота». ответ появляется, когда невозможно найти подходящий маршрут. Мне также нужно выполнить какую-то другую задачу, такую ​​как регистрация ошибок, когда это происходит.

Вот документация танцоров, за которой я следовал при создании маршрута по умолчанию. https://metacpan.org/pod/Dancer2 :: Cookbook # Default-Route

Это то, что у меня есть в нижней части моего файла основных маршрутов

any qr{.*} => sub {
    status 404;
    template 'test_error_template', { path => request->path };
};

Проблема в том, что я все еще держу получение сообщения по умолчанию Dancer 404, если запрошен неверный маршрут. Каким-то образом этот маршрут не выбирается.

Это то, что появляется в development.log, если я пытаюсь перейти на несуществующий маршрут

[server:5931] core @2020-01-22 10:31:55> looking for get /non_existing_route in /usr/share/perl5/vendor_perl/Dancer2/Core/App.pm l. 36
[server:5931] core @2020-01-22 10:31:55> Entering hook core.error.init in (eval 230) l. 1
[server:5931] core @2020-01-22 10:31:55> Entering hook core.error.before in (eval 230) l. 1
[server:5931] core @2020-01-22 10:31:55> Entering hook core.error.after in (eval 230) l. 1

Может кто-нибудь помочь? У меня есть несколько файлов маршрутов, это может быть частью проблемы?

Спасибо

1 Ответ

1 голос
/ 03 февраля 2020

Так что в моем случае проблема заключалась в том, что в файле маршрутов был установлен префикс. Маршрут по умолчанию не будет запущен, если я не включу префикс в URL. Например, /myprefix/invalid_route будет вызывать маршрут по умолчанию, а просто вызов /invalid_route не приведет к ошибке 404. Я еще не совсем придумал обходной путь, но это по крайней мере отвечает на мой первоначальный вопрос.

Редактировать:

Решил. Я создал новый файл маршрута default.pm, который содержит только маршрут по умолчанию с префиксом «/», и поместил его последним в app.psgi. Таким образом, это достигается только при сбое всего остального.

app.psgi

#!/usr/bin/env perl
use strict;
use warnings;

use main_routes;
use default;
myapp->to_app;

default.pm

package default;

prefix '/';

any qr{.*} => sub {
    #log and do other stuff here
    return 'my default route';
};

true;
...