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でバックエンドを構築しているという環境です。物理的には同じ筐体内で完結しています。
バックエンドはsinatraのRubyで書くなら以下のような形式になります。
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で書いてバックエンドは使い慣れた処理系で、といったシチュレーションは結構あるような気がします。