読者です 読者をやめる 読者になる 読者になる

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自体を扱えるか不安……。