Mojolicious初学(终章)

一、Websockets

Mojolicious提供了websocket功能,就使用而言算是十分简单的了:

use Mojolicious::Lite -signatures;

websocket '/echo' => sub ($c) {                                      #websocket是启用websocket关键词
  $c->on(json => sub ($c, $hash) {                                   #这是一个基于时间的异步监听,$hash代表前端发送来的json数据段。
    $hash->{msg} = "echo: $hash->{msg}";
    $c->send({json => $hash});
  });
};

get '/' => 'index';

app->start;
__DATA__

@@ index.html.ep
<!DOCTYPE html>
<html>
  <head>
    <title>Echo</title>
    <script>
      var ws = new WebSocket('<%= url_for('echo')->to_abs %>');     #前端websocket,这需要掌握js语法。
      ws.onmessage = function (event) {
        document.body.innerHTML += JSON.parse(event.data).msg;
      };
      ws.onopen = function (event) {
        ws.send(JSON.stringify({msg: 'I ♥ Mojolicious!'}));
      };
    </script>
  </head>
</html>

二、mode模式

对于web后端开发来说,无论何种框架都会有开发模式develoment和生产模式production。mojolicious也不例外。在我们启动mojolicious应用时,可以通过-m参数后跟production或development修改模式。mojolicious还有一项便利的log插件,方便我们产生调试日志。

use Mojolicious::Lite -signatures;

# Prepare mode specific message during startup
my $msg = app->mode eq 'development' ? 'Development!' : 'Something else!';    #通过app->mode判断模式。

get '/' => sub ($c) {
  $c->app->log->debug('Rendering mode specific message');                     #这是log在路由方法中的调用方式。
  $c->render(text => $msg);
};

app->log->debug('Starting application');                                      #这是log在全局模式的调用方式。
app->start;

三、Mojolicious测试

Test::Mojo是mojolicious的测试模块。方便我们开发测试:

use Test::More;
use Mojo::File qw(curfile);
use Test::Mojo;

# Portably point to "../myapp.pl"
my $script = curfile->dirname->sibling('myapp.pl');                     #载入mojolicious应用

my $t = Test::Mojo->new($script);
$t->get_ok('/')->status_is(200)->content_like(qr/Funky/);               #进行测试。

done_testing();

四、结语

至此,我们的Mojolicious初学部分就讲完了。本篇主要参考的Mojolicious::Guides::Tutorial,官方的初学说明文档。也算是官方文档的结合作者个人理解的翻译。

如果你已经熟练的掌握了我在清新Perl中提到的要点,那么Mojolicious初学也同样会轻松学习。

当然了,作为Web应用,不会数据库,就不算是完整的。下一期开始,我将带领各位学习一下Mojo::MySQL,Mojo的异步mysql数据库模块。

标签