Node + Redisでチャット的ななにかをつくる - チャットロビーとチャットルームの作成
Node+Redsi+Expressでとても実装に不安な会員登録&ログイン機能を実装した - AtAsAtAmAtArAの続き
app.jsのRoute
// Routes app.get('/', routes.index); app.get('/signup', routes.signup); app.post('/signup', routes.create_signup); app.get('/login', routes.login); app.post('/login', routes.create_login); app.get('/logout', routes.logout); app.get('/roby', routes.roby); app.post('/roby', routes.create_roby); app.get('/room/:id?', routes.room); app.post('/room/:id?', routes.create_room);
なんか '/room/:id?' でパラメータをとってくるところが大事みたい。詳しい仕様はそれっぽい公式コードサンプルみただけなので自信がない。
ロビー機能
こんな感じになった
exports.roby= function(req, res){ redis.lrange("room", 0, -1, function(err, room){ res.render('roby', { title: 'roby', room: room }); }); }; exports.create_roby= function(req, res){ if (req.body.room === "") return false; redis.rpush("room", req.body.room); redis.rpop("room", function(err, latest_room){ redis.rpush("room", latest_room); req.session.room = latest_room; res.redirect('/room/' + latest_room); }); };
rpopで最新のルームを取得して、そのままだと消えてしまうので再度rpushするという泥臭いことをしている。
チャット機能
こんな感じになった
exports.room= function(req, res){ redis.lrange("room:" + req.params.id, 0, -1,function(err, chat){ res.render('room', { title: "chat_room", chat: chat }); }); }; exports.create_room= function(req, res){ (req.session.name === undefined) ? name = '増田' : name = req.session.name; if (req.body.chat === "") return false; redis.rpush("room:" + req.session.room, name + ":" + req.body.chat); res.redirect('/room/' + req.session.room); };
lrangeとlpushまわりの挙動は公式githubみてもわかんなかったので google.com の英語の方で調べたらなんかサンプルがあった。結局コード読まなきゃいけないのなら、英語で調べると楽だね。
いちおう使っているテンプレートとか
jadeです
h1= title p Welcome to #{title} for obj in room ul li a(href = "/room/#{obj}") Room::#{obj} p form(action = "/roby", method = "POST") label 入室する: input(type = "text", name = "room") input(type = "submit", name = "入室する")
普通にformにinputがあって、あとは for obj in room で要素を取り出して表示してるだけですね。これはroby.jadeだけど、chat.jadeも似たようなものなので省略。
次はSocket.ioでSesssionを同期、チャットの反映
これができたら Node + Redisのチャットプロジェクトは終了かな。これができたら次は Node + Mongoでほぼ似たようなものを作る予定。ただSocket.ioとExpressのセッション同期と、実際Socket.io自体を扱えるか不安……。