今回は、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に接続できるモジュールもいくつかあるので、幅が広がりますね。
以上です。














