2013-03-30 17 views
5

Joel Berger posted this little program to start a web server to serve local files, và nó hoạt động tuyệt vời:Làm cách nào tôi có thể nhận được cổng mà Mojolicious :: Lite chọn?

use Mojolicious::Lite; 

@ARGV = qw(daemon); 

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

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

app->start; 

tôi prepopulated dòng lệnh trong @ARGV vì tôi quên để làm điều đó. Khi nó bắt đầu, nó mang lại một thông báo cho biết đó cổng nó đã chọn, sử dụng 3000 nếu nó có thể:

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

Tôi muốn để có được cổng mà ủng hộ về mặt ngữ pháp do đó, một bộ kiểm tra có thể biết được nơi để tìm nó và tôi không muốn làm điều đó bằng cách loại bỏ đầu ra. Không có thử nghiệm nào của tôi cho điều này hữu ích và tôi nghĩ rằng tôi luôn đi sai hướng. Dường như nó không chọn cổng cho đến khi nó bắt đầu, và một khi tôi gọi start, đó là kết thúc của nó.

Tôi cũng không muốn tự xác định cổng.

Đây không phải là vấn đề cấp thiết. Tôi có một giải pháp hiện tại cho điều này với một khuôn khổ HTTP đơn giản, nhưng tôi đã xem xét thay thế hầu hết những thứ đó với Mojo nếu tôi có thể. Kể từ khi những thứ cũ vẫn hoạt động, đây thực sự là một cái gì đó tốt đẹp để có chứ không phải là một cái gì đó theo cách của tôi.

+1

Sẽ hữu ích nếu bạn đăng mã mà từ đó bạn đang cố gắng lấy số cổng - để chúng tôi có thể thấy những gì bạn đang mong đợi tiết lộ và làm cách nào. –

+1

Tất cả mã đều ở ngay đó. Tôi muốn chạy kịch bản đó và biết số cổng. Câu trả lời của sri là nó luôn luôn là 3000 hoặc không có gì. –

+1

có thể dễ dàng kiểm tra: cố gắng khởi động 2 trường hợp ứng dụng song song cho lỗi 'Không thể tạo ổ cắm nghe: Địa chỉ đã được sử dụng tại ... '- điều này cho thấy mặc định là cổng duy nhất đã thử –

Trả lời

7

Bạn không thể, nhưng lệnh daemon chỉ liên kết với cổng 3000 và sẽ không thử bất kỳ điều gì khác trừ khi bạn yêu cầu. Nếu bạn đang sử dụng Test::Mojo, bạn không cần phải biết trước cổng, vì bất cứ điều gì khác bạn luôn có thể bao bọc ứng dụng của mình trong một kịch bản Mojo::Server::Daemon nhỏ.

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

Được rồi, điều cần biết. Tôi không thực sự tạo ứng dụng Mojo. Tôi đang sử dụng một máy chủ rất nhẹ để kiểm tra tìm nạp một số tệp tĩnh cho mã máy khách web. –

4

Với --listen param bạn chỉ định để ứng dụng của bạn, nơi để nghe:

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; 

Bạn có thể truy cập vào số cổng trong ứng dụng với $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; 

Tôi muốn thử nghiệm Mojolicious ứng dụng với Test::Mojo vì bạn có quyền truy cập vào ứng dụng đang chạy, ví dụ: trong tệp 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(); 

Tôi không chắc tôi đã hiểu chính xác những gì bạn đang cố gắng hoàn thành, nhưng tôi hy vọng điều này sẽ giúp bạn.

+0

Tôi đặc biệt nói rằng tôi không muốn chọn cổng. Tôi không muốn làm việc để tìm một cổng mở. Ngoài ra, truy cập vào máy chủ web để có được cổng có nghĩa là tôi không cần phải tìm ra cổng là gì. –

Các vấn đề liên quan