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

Node + MongoDBでチャット的ななにかをつくる - チャットルームの作成

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でもできたけど、いろいろあのときはデータ取り出しあたりで破綻して失敗した)。