Node + MongoDBでチャット的ななにかをつくる - チャットルームの作成
けっこう簡単だった
RDBでの知識を生かせる感じが楽
前回はこちら
Node + MongoDBでチャット的ななにかをつくる - Mongodbの導入、セッションを貼る、チャットロビーの作成まで - AtAsAtAmAtArA
Routes
app.js
app.get('/room/:id?', routes.room); app.post('/room/:id?', routes.create_room);
普通に動的にパラメータを与えられるようにする
Routes/index.js
exports.room = function(req, res){ req.session.room = req.params.id; ChatModel.find({room: req.session.room}, function(err, chat){ res.render('room', {title: 'room:' + req.session.room, chat: chat}); }); }; exports.create_room = function(req, res){ var chat = new ChatModel(); chat.chat = req.body.chat; req.session.name === undefined ? name = 'anony' : name = req.session.name; chat.name = name; chat.room = req.session.room; chat.save(); res.redirect('/room/' + req.session.room); };
ChatModel.find({})でroom: req.session.roomで部屋を指定してクエリをとってくる。チャット自体のモデルのSaveは見ての通り。Schemaは前回のエントリ参照
room.jade
extends layout block content h1= title p Welcome to #{title} for obj in chat p #{"2" + obj.date.getYear()}/#{(1+obj.date.getMonth())}/#{obj.date.getDate()}:#{obj.date.getHours()}:#{obj.date.getMinutes()}:#{("0" + obj.date.getSeconds()).slice(-2)}:#{obj.name}:#{obj.chat} #chat p form(action = "/room", method = "POST") label 発言する: input(type = "text", name = "chat") input(type = "submit", name = "発言する")
Express 3系なのでこういう感じ。 普通に for obj in chat で取り出して表示してる。DateについてはJSの記法がMongoではそのまま使えるっぽい。
参考::API Only - Stack Exchange
テンプレートで全部書かなきゃいけないってのもちょっとどうかと思ったけど、逆にテンプレートに書くべきなのかもとも思えて、うーんという感じ。本当はDate部分だけを別途にしてroutes/index.jsで処理すべきだとは思うけど、うーん、どうやるんだろうね?
まあ、これから
とりあえずざっくりした会員登録制チャットロビー + チャットルームができた。ちょっとだけSocket.ioでの通信ができるかまた試してみようとは思う(正確にはRedisでもできたけど、いろいろあのときはデータ取り出しあたりで破綻して失敗した)。