shimada-kの日記

ソフトウェア・エンジニアのブログです

Node.jsでサーバ間通信

Node.jsのAPI内で別サーバへ問い合わせてその内容をejsへ渡すということをやってみました。リアルタイム性を持たせたいからNode.js/websocketなんだけども、処理全部をjsで書くのはなーという考えからきてます。

    var options = { 
        host : 'localhost',
        // ポート番号
        port : 8001,
        // APIのパス
        path : '/hoge?foo=' + bar, 
    };  

    http.get(options, function(resp) {
        var content = ""; 

        resp.on('data', function(chunk){
            content += chunk;
        }).on('end', function(){
            data = JSON.parse(content);
            console.log(data);

            res.render('index.ejs', {
                layout: false,
                locals: {server_data : data}
            }); 
        }); 
    }).on('error', function(e) {
        console.log("Got error: " + e.message);
    });

Nodeサーバは80番で動かして8001番でApacheを動かしてsinatraでバックエンドを構築しているという環境です。物理的には同じ筐体内で完結しています。

バックエンドはsinatraRubyで書くなら以下のような形式になります。

get '/hoge' do
    #
    # 何かの処理
    #
    JSON.generate(data)
end

JSON.generateしているのはNode側へ渡すときにjson形式にしているからです。json形式に縛られる必要は特にないです。

http-proxyモジュールなどを経由してNodeサーバを動かす場合はルーターの設定を工夫すれば外部からバックエンドのAPIへNode経由ではなく直接アクセスさせることも可能です。

var httpProxy = require('/usr/local/lib/node_modules/http-proxy');

var options = {
  //hostnameOnly: true,

  router: {
    'サーバ名/hoge'    :'localhost:8001/hoge',
  }
};

var prodServer = httpProxy.createServer(options);
prodServer.listen(80);
console.log('prodServer works');

リアルタイム部分はNode.jsで書いてバックエンドは使い慣れた処理系で、といったシチュレーションは結構あるような気がします。