2013-03-30 9 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でそれらのほとんどを置き換えることを検討してきました。古いものはまだ動作しているので、これは本当に私の方法で何かではなく、持っているだけでいい何かです。

お聞きにアプリに指定 --listenのparamで
+1

ポート番号を取得しようとしているコードを投稿すると、mojoliciousがどのように公開されているのかがわかります。 –

+1

すべてのコードはすぐそこにあります。私はそのスクリプトを実行し、ポート番号を知りたい。スリランカの答えは、それは常に3000または何もないということです。 –

+1

は簡単にテストできました.2つのappインスタンスを同時に起動しようとすると、「待機ソケットを作成できません:アドレスはすでに使用中です...」というエラーが表示されます。これは、デフォルトで唯一試行されたポートであることを示しています –

答えて

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アプリを作りません。私は非常に軽いサーバーを使用して、Webクライアントコード用のいくつかの静的ファイルの取得をテストしています。 –

4

:私はMojoliciousアプリケーションをテストする

#!/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; 

:あなたは$self->tx->local_portでアプリ内でのポート番号にアクセスすることができます

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; 

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

私は特にポートを選択したくないと言った。私は開いた港を見つけるために仕事をしたくありません。また、Webサーバーにアクセスしてポートを取得すると、ポートが何であるかを知る必要はありません。 –

関連する問題