今回は、AmazonDynamoDBをメッセージの保存場所としてみます。
node.js でDynamoDBを利用するには、dynodeというモジュールを使用します。
dynodeはDynamoDBへのAPIアクセスをラップしてnodeライクに使うことができます。
では早速触ってみたいと思います。
まずdynodeをインストールします。
# npm install -g dynode
ロードと設定は以下のように行います。
var dynode = require('dynode'); dynode.auth({region:"ap-northeast-1", accessKeyId:"xxxxxxxxxxxxxxxxxx", secretAccessKey:"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"});
また、各メソッドは以下のようにコールバック式で行います。
dynode.putItem("chat", {id:id, msg:msg, date:(new Date()).toString()}, function(err, res){ console.log(err); });
ここでは、メッセージの保存先として、idというプライマリキーと、dateをレンジキーをもつchatというテーブルを作成します。
サンプルとして以前のチャットプログラムを使用します。
server.js
connectionハンドラで、接続が確率したときにchatテーブルから過去のメッセージをスキャンしてarchiveイベントに乗せてクライアントにemitします。
また、msgハンドラでは、いままで単純にemitしていたところを、dynode.putItemで保存してからemitするようにしました。
var server = require('http').createServer(function(req, res){ res.writeHead(200, {'Content-Type': 'text/html'}); res.end('server connected'); }); server.listen(3001); var dynode = require('dynode'); dynode.auth({region:"ap-northeast-1", accessKeyId:"xxxxxxxxxxxxxxxxxx", secretAccessKey:"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"}); var io = require('socket.io').listen(server); var RedisStore = require('socket.io/lib/stores/redis'); opts = {host:'10.0.0.200', port:6379}; io.set('store', new RedisStore({redisPub:opts, redisSub:opts, redisClient:opts})); io.sockets.on('connection', function (socket) { var id = socket.id; //メッセージ履歴をscanします dynode.scan("chat", function(err, res){ //dateでソートします res.sort(function(a,b){ if(a.date < b.date)return -1; if(a.date > b.date)return 1; return 0; }); //archiveイベントに送信します。 io.sockets.emit('archive', { id:id, archive: res }); io.sockets.emit('info', { id:id, msg: 'welcome '+id }); }); socket.on('msg', function (msg) { io.sockets.emit('msg', {id:id, msg: msg});< //保存します。 dynode.putItem("chat", {id:id, msg:msg, date:(new Date()).toString()}, function(err, res){ if(err){ console.log(err); console.log(res); } }); }); socket.on('disconnect', function(){ io.sockets.emit('info', {id:id, msg: 'bye '+id}); }) });
client.js
クライアント側では、新たにarchiveハンドラを作成し、メッセージをまとめて展開できるようにしておきます。
$(function(){ var socket = io.connect('http://'+hostname+':3001/'); socket.on('connect', function() { $("#log").html($("#log").html() + "<br />" + 'connected'); socket.on('info', function (data) { $("#log").html($("#log").html() + "<br />" + data.msg); }); socket.on('archive', function(data){ //メッセージ履歴を表示します。 for(var i=0;i<data.archive.length;i++){ $("#log").html($("#log").html() + "<br />" + "<b>" + data.archive[i].id + ":</b>" + data.archive[i].msg); } }); socket.on('msg', function(data){ $("#log").html($("#log").html() + "<br />" + "<b>" + data.id + ":</b>" + data.msg); }); $("#send").click(function(){ var msg = $("#msg").val(); if(!msg){ alert("input your message"); return; } socket.emit('msg', msg); }); }); });
これで完了です。それでは動かして見ましょう。
以下のように、メッセージを投稿すると、
以下のようにDynamoに登録されているのがわかります。
ひとしきりメッセージを送ったあと、別のブラウザで接続すると、過去のメッセージが表示されるようになりました。
このように、nodeでもAWSに接続できるモジュールもいくつかあるので、幅が広がりますね。
以上です。