2013-03-30 2 views
5

Joel Berger posted this little program to start a web server to serve local files, и он прекрасно работает:Как я могу получить порт, который выбирает Mojolicious :: Lite?

use Mojolicious::Lite; 

@ARGV = qw(daemon); 

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

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

app->start; 

Я уже заполнена командной строки в @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. 

Я хотел бы получить, что порт про грамматически так тестовый набор может знать, где искать его , и я бы предпочел не делать этого, сломав выход. Ни один из моих экспериментов для этого не был полезен, и я думаю, что я всегда был в неправильном направлении. Похоже, что он не выбирает порт, пока он не запустится, и как только я позвоню start, это конец.

Я тоже не хочу указывать порт.

Это не вопрос срочности. У меня есть текущее решение этого с другой простой базой данных HTTP, но я смотрел на замену большей части этого материала Mojo, если можно. Поскольку старый материал все еще работает, на самом деле это просто что-то приятное, а не что-то на моем пути.

+1

Было бы полезно, если бы вы отправили код, из которого вы пытаетесь получить номер порта, чтобы мы могли видеть, что вы ожидаете от мозаики, чтобы разоблачить и как это сделать. –

+1

Весь код находится прямо здесь. Я хочу запустить этот скрипт и узнать номер порта. Ответ Шри: это всегда 3000 или ничего. –

+1

, что было бы легко проверить: попытка запустить 2 экземпляра приложения в параллель дает ошибку 'Can not create listen socket: Address, уже использующийся в ...' - это показывает, что по умолчанию используется только единственный порт –

ответ

7

Вы не можете, но команда 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; 
+0

Хорошо, интересно знать. Я не создаю приложение Mojo. Я использую очень легкий сервер, чтобы тестировать некоторые статические файлы для кода веб-клиента. –

4

С --listen парам вы указываете приложение, где слушать:

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; 

Вы можете получить доступ номер порта в пределах приложения с $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; 

Я хотел проверить 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(); 

Я не уверен, что правильно понял, чего вы пытаетесь достичь, но я надеюсь, что это поможет вам.

+0

Я специально сказал, что не хочу выбирать порт. Я не хочу делать работу, чтобы найти открытый порт. Кроме того, доступ к веб-серверу для получения порта означает, что мне не нужно выяснять, что такое порт. –

Смежные вопросы