Maturitní práce

Webové technologie na straně serveru

Node.js framework pro webové aplikace

Jan Kuča

Webová aplikace
  • Webová stránka umožňující zásah do svého obsahu
GET /
POST /form
Node.js
  • Serverové prostředí
  • JavaScriptové jádro V8
  • Event-driven
    • Jeden proces
  • HTTP(S), FileSystem, …
HTTP server v Node.js
      function handleRequest(request, response) {
        response.writeHead(200);
        response.end('Ahoj!');
      }
      var server = http.createServer(handleRequest);
      server.listen(80);
    
Framework
  • Knihovna řešící komplexní problém
  • Řeší problém za vývojáře aplikace
  • Vede vývojáře k určitému systému organizace kódu
  • Šetří čas
Framework Darkside.js
  • Definice základní struktury aplikace
  • Směrování HTTP a WebSocket dotazů
  • Zpracování šablon
  • Zprostředkování komunikace s databází
Struktura aplikace
  • HTTP server, WebSocket server
  • Router
  • Resource servery, Controllery
  • Služby
Bootovací soubor
  • boot.js
  • Zaváděcí script
  • Sestavuje objektový model aplikace
  • Nastavuje prostředí
Bootovací soubor
      var app = darkside.createApplication(__dirname);
      var server = app.createHTTPServer();
       
      server.listen(80);
    
Router
  • Směruje HTTP a WebSocket dotazy
  • Server → Router → ?
    • Deklarace routovacích pravidel
Deklarace routovacích pravidel
  • Soubor routes.declaration
      *
        / = 'front:post:index'
        /posts/:id = 'front:post:show'
    
  • front = modul, post = controller, index|show = akce
Vložení routeru do aplikace
      var router = app.router;
       
      router.setRouteDeclaration('./routes.declaration');
      server.setRouter(router);
    
HTTP Server Router Controller Factory
Post Controller
Controllery
  • Obsahují aplikační logiku
  • Obsluhují dotazy, odpovídají na ně
  • Instanciovány komponentou controller factory
  • Request-based životnost
  • Několik typů:
    • Controller, ViewController, ApiController
Controllery
      var PostController = function (posts) {
        this.posts_ = posts;
      };
       
      util.inherits(PostController, darkside.ViewController);
      PostController.prototype.$deps = [ 'posts' ];
    
Akce controllerů
      PostController.prototype['index'] = function (params) { … };
    
  • Názvy odpovídají deklaraci routovacích pravidel:
              / = 'front:post:index'
            
  • Argumentem je výčet parametrů dotazu:
    /?page=2params = { 'page': '2' }
Dependency Injection
  • Návrhový vzor pro stavbu objektového modelu
  • Komponenta nemá hledat své závislosti.
  • O závislosti si má říci svému tvůrci.
  • Deklarace závislostí
Global Dependant Injector Dependant
Bez Dependency Injection S Dependency Injection
Dependency Injection
      function () {
        var repository = global.Repository.getInstance();
        repository.search();
      }
      function (repository) {       ← Lépe testovatelné
        repository.search();
      }
    
Dependency Injection
  • V případě controllerů služby
    • Služba – specializovaná komponenta existující po celý běh aplikace
      var PostController = function (posts) {
        this.posts_ = posts;
      };
      PostController.prototype.$deps = [ 'posts' ];
    
Views
  • Formát výstupních dat controlleru
Controller View Stack View View
Template Template
Views
  • Templatovací jazyk: ECO – Embedded CoffeeScript
  • Značky vložené do HTML:
    • <%= @promenna %>
    • <% if @promenna is 'a': %><% end %>
    • <% for post in @posts: %><% end %>
  • Skládání views/templatů:
    • @component
      <!DOCTYPE html>
      <title><%= @component 'title' %></title>
      <header>Název aplikace</header> <nav>Menu: ...</nav>
      <%= @component 'content' %>
    
      <% @component 'title', => %>Úvodní stránka<% end %>
      <% @component 'content', => %>
        <p>Vítejte na úvodní stránce aplikace…
      <% end %>
    
Databáze
  • MongoDB (NoSQL)
    • Založené na kolekcích dokumentů
    • Dokument = key-value objekt; volný set polí
  • Repozitáře entit
    • Spravují jednotlivé kolekce dokumentů
    • Entita = reprezentace jednotlivého dokumentu
    • Služby
Repozitáře entit
  • Metody pro získávání entit:
    • one(selector) – vrátí první dokument
    • all(selector) – vrátí všechny dokumenty
  • Metody pro správu entit:
    • createEntity() – vytvoří prázdnou entitu
    • save(entity) – uloží danou entitu
Deklarace služeb
  • Soubor services.declaration
      database
        @ = darkside.MongoDBService
        name = 'nazev'
        server = 'localhost:27017'
      @repositories
        posts
    
Vložení služeb do aplikace
  • Bootovací soubor:
              var services = app.services;
              services.setServiceDeclaration('./services.declaration');
            
  • Controllery:
              var PostController = function (posts) { … };
              PostController.prototype.$deps = [ 'posts' ];
            
Request HTTP Server Router Controller Factory
Database Post Repository Post Controller Response
Templates Views View Stack
WebSockets
  • Alternativní způsob komunikace
  • Nižší úroveň než HTTP
  • Jedno spojení pro více dotazů
  • Obousměrné spojení
    • Klient se nemusí dotazovat na aktualizace.
    • Server mu je může sám ihned poskytnout.
WebSockets
  • Darkside.js implementuje JSON protokol podobný HTTP.
  • Dotaz:
              { "method": "GET", "path": "/", "headers": {} }
            
  • Odpověď:
              { "status": 200, "headers": [], "body": … }
            
  • Aplikaci (controllery) nemusí zajímat způsob komunikace.
WebSockets
  • Založeny na událostech
  • Dotazová (HTTP) vrstva jsou události request a response
  • Controllery a služby mohou posílat vlastní
  • Odesílatel:
              connection.emit('message', 'Ahoj!');
            
  • Příjemce:
              connection.on('message', function (message) { … });
            
Přednosti frameworku Darkside.js
  • Solidně navržený objektový model
    • MVC architektura + Dependency Injection (služby)
    • Snadná úprava aplikací
  • HTTP i HTTPS: darkside.createHTTPServer(https)
  • WebSockets
    • Posílání událostí
    • Dlouhá životnost spojení
  • Vhodný serverový základ i pro mobilní aplikace
Děkuji za pozornost