我怎样才能获得Mojolicious :: Lite选择的端口?

bri*_*foy 7 perl port dynamically-generated mojolicious

Joel Berger发布了这个小程序来启动一个Web服务器来提供本地文件,它运行得很好:

use Mojolicious::Lite;

@ARGV = qw(daemon);

use Cwd;
app->static->paths->[0] = getcwd;

any '/' => sub {
    shift->render_static('index.html');
    };

app->start;
Run Code Online (Sandbox Code Playgroud)

我预先填充了命令行,@ARGV因为我忘了这样做.当它启动时,它会给出一条消息,告诉您它选择了哪个端口,如果可以,则使用3000:

$ perl ~/bin/mojo_cwd
[Fri Mar 29 19:14:09 2013] [info] Listening at "http://*:3000".
Server available at http://127.0.0.1:3000.
Run Code Online (Sandbox Code Playgroud)

我想以编程方式获得该端口,以便测试套件可以知道在哪里查找它,而我宁愿不通过报废输出来实现.我的实验没有一个是有用的,我认为我总是朝着错误的方向前进.它似乎在它启动之前不会选择端口,一旦我打电话start,它就是它的结束.

我也不想自己指定端口.

这不是一件紧急事情.我有一个当前的解决方案与另一个简单的HTTP框架,但我一直在寻找用Mojo替换大部分的东西,如果可以的话.由于旧的东西仍然有效,这真的是一件好事,而不是我的方式.

Seb*_*del 8

你不能,但daemon命令只绑定到端口3000,除非你告诉它,否则不会尝试任何其他操作.如果您正在使用Test::Mojo,无论如何都不需要提前知道端口,对于其他任何东西,您总是可以将您的应用程序包装在一个小Mojo::Server::Daemon脚本中.

use Mojolicious::Lite;
use Mojo::IOLoop;
use Mojo::Server::Daemon;

get '/' => {text => 'Hello World!'};

my $port   = Mojo::IOLoop->generate_port;
my $daemon = Mojo::Server::Daemon->new(
  app    => app,
  listen => ["http://*:$port"]
);
$daemon->run;
Run Code Online (Sandbox Code Playgroud)


Tud*_*tin 6

使用--listenparam,您可以指定应用程序在哪里收听:

use Mojolicious::Lite;

@ARGV = qw(daemon --listen http://*:5000);

use Cwd;
app->static->paths->[0] = getcwd;

any '/' => sub {
    shift->render_static('index.html');
    };

app->start;
Run Code Online (Sandbox Code Playgroud)

您可以访问应用程序中的端口号$self->tx->local_port:

#!/usr/bin/env perl
use Mojolicious::Lite;

@ARGV = qw(daemon --listen http://*:5000);

use Cwd;
app->static->paths->[0] = getcwd;

any '/' => sub {
    my $self = shift;

    $self->render_text('port: '. $self->tx->local_port);
    };

app->start if $ENV{MOJO_MODE} ne 'test';

1;
Run Code Online (Sandbox Code Playgroud)

我喜欢测试Mojolicious应用程序,Test::Mojo因为您可以访问正在运行的应用程序,例如,在文件中t/test_mojo.t:

use strict;
use warnings;

use feature 'say';

use Test::More;
use Test::Mojo;

$ENV{MOJO_MODE} = 'test';

require "$FindBin::Bin/../test_mojo.pl";

my $t = Test::Mojo->new;
$t->get_ok('/')->status_is(200)->content_is('port: '.$t->tx->remote_port);

say 'local port: '. $t->tx->local_port; #as seen from the user-agent's perspective
say 'remote port:'. $t->tx->remote_port;
done_testing();
Run Code Online (Sandbox Code Playgroud)

我不确定我是否正确地理解了你想要完成的任务,但我希望这对你有所帮助.