Hatena::Grouporera

もし高校野球の女子マネージャーがOpera Browserを使ったら

logo
 | 

2010-04-14

EJSGI

04:38

JSGI という、サーバーサイド JavaScript アプリケーションの書き方を統一しましょうという動きがあって、でもそれだと同期処理が基本になってしまうなので、JavaScript には向いてないんじゃない? という話を前に書いた。

つまり、ウェブサーバーというのはリクエストをレスポンスに変換するだけの関数と言えるが、JavaScript には非同期を前提にした処理があるため、単純な関数としては書けない場合が出てくる。

そこで、非同期ベースの EJSGI というのが作られているらしい。

こういうふうにサーバーが書ける。

var ejsgi = require("../lib/ejsgi");

var form = [
  '<!doctype html>',
  '<html><head><title>A simple form</title></head>',
  '<body>',
  '<form method="post" target="">',
    '<fieldset>',
      '<label>A simple form</label>',
      '<input name="foo" type="text" value="data goes here">',
      '<input name="submit" type="submit" value="Submit Data">',
    '</fieldset>',
  '</form>',
  '</body>',
  '</html>'
].join("");

ejsgi.Server(function bodyEcho (req) {
  var out = { body : new (req.jsgi.stream) };
  switch (req.method) {
    case "POST":
      out.status = 200;
      out.headers = {"content-type" : "text/plain"};
      req.input.addListener("data", function (chunk) { out.body.write(chunk) });
      req.input.addListener("end", function () { out.body.close() });
    break;
    default:
      out.status = 200;
      out.headers = {
        "content-type" : "text/html",
        "content-length" : form.length
      };
      out.body.write(form);
      out.body.close();
    break;
  }
  return out;
  
}, 8000, "localhost").start();
http://github.com/isaacs/ejsgi/blob/6144093e053b9295607b3d1240e1f67b43b73714/examples/read-body.js

ejsgi.Server に渡す関数の部分は、req というオブジェクトを受け取る。req のプロパティには method、url、queryString などのリクエストに関するパラメータや、input という Stream オブジェクトがある。(後述)

レスポンスとしてはまず、メインの関数でオブジェクトを返し、そのオブジェクトは status と header というプロパティの他に、body という Stream オブジェクトも持つ。

Stream オブジェクトには write や close というメソッドがあり、addListener というイベントリスナーを付けるメソッドもある。

上のコードでは

req.input.addListener('data', function(chunk) { out.body.write(chunk) });

のようになっている部分。

インプットストリームは一括ではなくいくつかのパケット (chunk) になって受け取るので、それぞれ data というイベントが出される。


これは Opera Unite と親和性が高そう。Web SQL Database も使えるし。

もし Mac 版 Opera 10.5x が使いものになるようなら移植してみたい。

トラックバック - http://orera.g.hatena.ne.jp/edvakf/20100414
 |