1

我正在使用 Mojolicious::Lite 来声明 Web 服务的路由。也许我误解了路由的行为,但如果我在路由定义中调用子例程,它只会被调用一次
我认为每次调用 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路由时的控制台输出:

你好 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] [debug] [78278b87] GET "/test"
[2020-04-04 22:07:28.26097] [69050] [debug] [78278b87] 200 OK (0.000626s, 1597.444/s)

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

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

感谢您的帮助和解释。

4

2 回答 2

4

您的代码实际上并未呈现。您的getsub 需要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());
}
于 2020-04-04T21:34:57.353 回答
1

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

get '/test' => {

应该:

get '/test' => sub {

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

于 2020-04-30T22:59:29.510 回答