Perl Прикольные маршруты вызывают саб только один раз - PullRequest
1 голос
/ 04 апреля 2020

Я использую Mojolicious :: Lite для объявления маршрутов для веб-сервиса. Может быть, я неправильно понял поведение маршрутов, но если я вызываю подпрограмму в определении маршрутов, она вызывается только один раз .
Я полагаю, что подпрограмма должна срабатывать каждый раз, когда вызывается маршрут веб-сервиса ... что не так.

Например, я написал тестовый маршрут:

use Mojolicious::Lite;

get '/test' => {
    text => get_test()
};

sub get_test {
    say 'Hello iam only showing up once';

    return 'test';
};

Это вывод консоли при запуске сервера и посещении localhost: 3000 / test route:

Здравствуйте, iam появляется только один раз
[2020-04-04 22: 07: 21.09011] [69050] [info] Прослушивание по адресу "http: // *: 3000"
Сервер доступен в http://127.0.0.1: 3000
[2020-04-04 22: 07: 28.26033] [69050] [отладка] [78278b87] GET "/ test"
[2020-04-04 22: 07: 28.26097] [69050] [debug] [78278b87] 200 OK (0,000626s, 1597,444 / с)

«Hello iam, показывающий только один раз», выводится один раз при запуске сервера , Посещение маршрута не вызывает саб снова.
Если это требуемое поведение, как я могу заставить мои маршруты запускать подпрограмму каждый раз, когда посещается маршрут?

Мне это нужно, потому что я использую этот веб-сервис в своем приложении для сканирования сети и возврата результата , И я хочу пересматривать сеть каждый раз, когда вызываю маршрут GET веб-службы. В противном случае данные будут бесполезны, если они не обновлены.

Спасибо за вашу помощь и объяснения.

Ответы [ 2 ]

3 голосов
/ 05 апреля 2020

Ваш код фактически не рендерится. Ваша подпрограмма get должна вызвать метод render из Mojolicious :: Controller. Внутри get sub $_[0] является экземпляром контроллера. В приложении Mojolicious :: Lite маршрут и контроллер объединены, поэтому вам необходимо выполнить рендеринг. Если вы измените свой код на этот, он будет делать то, что вы ожидаете.

use Mojolicious::Lite;

get '/test' => sub {
    shift()->render(text => get_test());
};

sub get_test {
    warn "Hello I show up on every hit.\n";

    return 'test';
};

Ключевым отличием является вызов shift()->render(...), который также можно записать так:

get '/test' => sub {
    my $c = shift;
    $c->render(text => get_text());
}
0 голосов
/ 01 мая 2020

Приведенный выше ответ хорош, но одна из ключевых проблем в вашем коде состоит в том, что вы, похоже, неправильно определили свой код маршрута. Ref:

get '/test' => {

должно быть:

get '/test' => sub {

Вот почему ваш get_test вызывается только один раз - вы определяете ha sh и заполняете его результатом get_test, а не определяете подпрограмму. Но см. Ответ @ DavidO для получения полной информации о том, как подойти к этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...