【问题标题】:Perl Mojolicious routes call sub only oncePerl Mojolicious 路由只调用一次 sub
【发布时间】:2020-04-04 20:44:03
【问题描述】:

我正在使用 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 路由时的控制台输出:

你好,我只出现一次
[2020-04-04 22:07:21.09011] [69050] [信息] 在“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] [调试] [78278b87] 200 OK (0.000626s, 1597.444/s)

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

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

感谢您的帮助和解释。

【问题讨论】:

    标签: perl web-services routes mojolicious mojolicious-lite


    【解决方案1】:

    您的代码实际上并未呈现。您的 get 子需要从 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());
    }
    

    【讨论】:

      【解决方案2】:

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

      get '/test' => {
      

      应该是:

      get '/test' => sub {
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-23
        • 2019-05-30
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多