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 的回答以了解有关如何处理此问题的完整详细信息。
我正在使用 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 的回答以了解有关如何处理此问题的完整详细信息。