ユーザ用ツール

サイト用ツール


nodejs

文書の過去の版を表示しています。


node.js

node.jsはノンブロッキングI/Oとイベント駆動が特徴のJavaScript実行環境。イベントループ型のサーバを簡単に実装できる。Chromeブラウザと同じV8エンジンが使用されている。

tips

callbackと例外のアンチパターン

function someAsyncFunc(callback) {
   // 途中省略...
   
   try {
       callback();
   } catch (e)
       callback(e);
   }
}

try側のcallback中に例外が発生するとcatch側のcallbackが呼ばれるので2回呼ばれてしまう

HTML5 の Server-Sent Events を実装してみる

node.jsでServer-Sent Eventsを試す - nullpo.printStackTrace();

サーバ側を node.js で実装してみる。

generator.js

// EventEmitterを取得
var events = require("events");
var emitter = new events.EventEmitter();
 
// EventEmitterを拡張
emitter.id = 0;
emitter.data = "";
emitter.start = function() {
    var chars = "node.js";
    var self = this;
    setInterval(function() {
        var pos = Math.floor(Math.random() * chars.length * 2); 
        if (pos < chars.length) {
            self.id++;
            self.data = chars.charAt(pos);
            // generatedイベントとして登録されたリスナを呼び出す
            self.emit("generated", self.id, self.data);  
        }
    }, 1000);
};
 
// module.exportsに設定されたオブジェクトがrequireの戻り値となる。
module.exports = emitter; 

server.js

var http = require("http")
http.createServer(handler).listen(8124);
 
var generator = require("./generator")
generator.start();
 
function handler(req, res) {
 
    function response(id, data) {
        generator.removeListener("generated", arguments.callee);
 
        res.writeHead(200, {
            "Content-type": "text/event-stream"
        });
        res.write("id:" + id + "\n");
        res.write("data:" + data + "\n");
        res.write("retry: 1000");
        res.end();
 
    }
    generator.on("generated", response);
}

クライアント側のJavaScript

var source = new EventSource(url);
source.onmessage = function(event) {
  // データ受信時の処理を書く
  // event.data でサーバから送られてきたデータを取得できる
}
nodejs.1446788542.txt.gz · 最終更新: 2015/11/06 05:42 by nullpon