2013-03-30 17 views
5

Joel Berger posted this little program to start a web server to serve local files ve harika işler: Bunu unuttuğunuz için Mojolicious :: Lite'nin seçtiği limanı nasıl alabilirim?

use Mojolicious::Lite; 

@ARGV = qw(daemon); 

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

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

app->start; 

ben @ARGV komut satırını önceden doldurulur. o başladığında, eğer o 3000 kullanarak, bu seçti hangi bağlantı noktasını belirten bir mesaj veriyor:

$ 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. 

Ben yanlısı dilbilgisi o portu almak istiyorum bu yüzden bir test paketi nereye bakmanız için bilebilir ve çıktıyı çıkartarak bunu yapmamayı tercih ederim. Bunun için yaptığım deneylerin hiçbiri yararlı değildi ve bence her zaman yanlış yöne gittim. Başlamadan önce portu seçmediği ve start dediğimde, bunun sonu budur.

Bağlantı noktasını kendim de belirtmek istemiyorum.

Bu acil bir sorun değildir. Bunun için başka bir basit HTTP çerçevesiyle şu anki bir çözümüm var, ancak yapabileceğim kadarıyla Mojo'la çoğunu değiştirmeye bakıyordum. Eski şeyler hala işe yarıyor, bu gerçekten benim yolumda bir şey yerine sahip olmak güzel bir şey. Eğer uygulamanıza belirtmek --listen param ile

+1

Bağlantı noktası numarasını almaya çalıştığınız kodu postayla göndermeniz yararlı olur; böylece ne yapmak için mojolili ve ne beklediğini görebiliyoruz. –

+1

Tüm kodlar tam burada. Bu senaryoyu çalıştırmak ve port numarasını öğrenmek istiyorum. sri'nin cevabı her zaman 3000 ya da hiç yok. –

+1

test etmek kolay olurdu: paralel olarak 2 uygulama örneğini başlatmaya çalışırken hata veriyor 'Dinleme soketi oluşturulamıyor: Adres zaten kullanılıyor ...' - bu varsayılanın tek port denediğini gösteriyor –

cevap

7

Yapamazsınız, ancak daemon komutu yalnızca 3000 numaralı bağlantı noktasına bağlanır ve bunu söylemediğiniz sürece başka bir şey denemez. Test::Mojo'u kullanıyorsanız, zaten bağlantı noktasını önceden bilmeniz gerekmez, başka herhangi bir şey için uygulamanızı her zaman biraz Mojo::Server::Daemon betiğine kaydedebilirsiniz.

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

Tamam, bilmek güzel. Ben gerçekten bir Mojo uygulaması oluşturmuyorum. Web istemci kodu için bazı statik dosyaları getirmeyi test etmek için çok hafif bir sunucu kullanıyorum. –

4

nerede dinlemek için:

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; 

Sen $self->tx->local_port uygulamanın içinden port numarasını erişebilirsiniz:

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

Birlikte Mojolicious uygulamalar test etmek Test::Mojo, örneğin çalışan uygulamaya erişiminiz olduğundan, örneğin, bir dosyada 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(); 

Neyi başarmaya çalıştığınızı tam olarak anladığımdan emin değilim, ama umarım bu size yardımcı olur.

+0

Özellikle limanı seçmek istemediğimi söyledim. Açık bir liman bulmak için iş yapmak istemiyorum. Ayrıca, portu almak için web sunucusuna erişmek, limanın ne olduğunu öğrenmem gerekmediği anlamına geliyor. –

İlgili konular