Perl Mojolicious 路由只调用 sub 一次

Perl Mojolicious routes call sub only once

我正在使用 Mojolicious::Lite 声明网络服务的路由。 也许我误解了路由行为,但如果我在路由定义中调用子例程,它只会被调用 一次
我认为每次调用 web 服务路由时都应该触发 sub ......但事实并非如此。

例如我写了一条测试路线:

use Mojolicious::Lite;

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

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

    return 'test';
};

这是启动服务器并访问 localhost:3000/test 路由时的控制台输出:

Hello iam only showing up once
[2020-04-04 22:07:21.09011] [69050] [info] Listening at "http://*:3000"
Server available at http://127.0.0.1:3000
[2020-04-04 22:07:28.26033] [69050] [debug] [78278b87] GET "/test"
[2020-04-04 22:07:28.26097] [69050] [debug] [78278b87] 200 OK (0.000626s, 1597.444/s)

服务器启动时输出一次"Hello iam only showing up once"。访问路线不会再次触发潜艇。
如果这是想要的行为,我怎样才能让我的路线在每次访问路线时触发子?

我需要这个,因为我在我的应用程序中使用这个网络服务来扫描网络并 return 结果。每次我调用 webservice GET 路由时,我都想重新扫描网络。否则,如果数据不是最新的,数据将毫无用处。

感谢您的帮助和解释。

您的代码实际上并未呈现。您的 get sub 需要从 Mojolicious::Controller 调用 render 方法。在 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());
}

上面的答案很好,但是您代码中的一个关键问题是您似乎错误地定义了路由代码 ref:

get '/test' => {

应该是:

get '/test' => sub {

这就是为什么您的 get_test 只被调用一次 - 您正在定义一个散列并用 get_test 的结果填充它,而不是定义一个子例程。但是请参阅@DavidO 的回答以了解有关如何处理此问题的完整详细信息。