Cloud9でNode.js+MongoDB+mongooseを利用する
Cloud9ではMongoDBは最初からインストールされているので今回はこれを利用する。
まずはDashboardで「CREATE NEW WORKSPACE」を選択し、プロジェクトの名前を決め、Node.jsを選択して作成する。
しばらく待つとプロジェクトの準備が終わり、「START EDITING」ボタンを選択すると編集できる。
早速そのままserver.jsを開いて実行すると、単純なチャットアプリが最初から動かせる状態になっている。
ここでは名前とメッセージを入力して発言する形になっているので、この内容をMongoDBに保存するように修正する。
まずはMongoDBのバージョンを確認する。
下部のTerminalで次のように入力する。
1 2 3 4 | $ mongod --version db version v2.6.9 2015-06-12T05:08:12.352+0000 git version: df313bc75aa94d192330cb92756fc486ea604e64 $ |
そしてNode.jsからMongoDBへアクセするためのドライバが必要になるので準備をする。
今回は、mongooseを使ってみる。
Terminalからnpmでモジュールをインストール。
1 | $ npm install mongoose |
MongoDBを起動。
1 2 3 4 | $ mkdir db $ echo 'mongod --nojournal --noprealloc --dbpath db' > mongod $ chmod a+x mongod $ ./mongod |
続いてメッセージ情報を保存するための空のデータベースを作成する。
Window->New Terminalから新しいTerminalを立ち上げ、次のようにメッセージ情報を登録するためのCollectionを作成する。
今はドキュメントが何もない状態。
1 2 3 4 5 6 7 8 9 10 11 12 | $ mongo MongoDB shell version: 2.6.9 connecting to: test > show dbs admin (empty) local 0.078GB > use post switched to db post > db.createCollection("posts"); { "ok" : 1 } > db.posts.find() > |
最後にserver.jsのコードにデータベースへアクセスする処理を追加する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | // // # SimpleServer // // A simple chat server using Socket.IO, Express, and Async. // var http = require('http'); var path = require('path'); var async = require('async'); var socketio = require('socket.io'); var express = require('express'); // // ## SimpleServer `SimpleServer(obj)` // // Creates a new instance of SimpleServer with the following options: // * `port` - The HTTP port to listen on. If `process.env.PORT` is set, _it overrides this value_. // var router = express(); var server = http.createServer(router); var io = socketio.listen(server); router.use(express.static(path.resolve(__dirname, 'client'))); var messages = []; var sockets = []; // -------------------------------------------------------- // ここから // -------------------------------------------------------- var mongoose = require('mongoose'); // スキーマ定義 var PostSchema = new mongoose.Schema({ name: String, text: String }); // モデルとして登録 var Post = mongoose.model('Post', PostSchema); // mongodbに接続 mongoose.connect('mongodb://localhost:27017/post', // postの部分はデータベース名 // コールバックでエラー時の処理が書ける。 function(err) { if (err) { console.log(err); } else { console.log('connection success!'); } } ); // findしてDBの値を表示 Post.find({}, function(err, docs){ if(!err){ console.log("num of item => " + docs.length); for(var i=0; i<docs.length; i++){ console.log(docs[i].name); console.log(docs[i].text); var doc = docs[i]; // メッセージ情報を格納 messages.push(doc); } console.log("find!"); } else { console.log("not find!"); } }); // -------------------------------------------------------- // ここまで // -------------------------------------------------------- io.on('connection', function (socket) { messages.forEach(function (data) { socket.emit('message', data); }); sockets.push(socket); socket.on('disconnect', function () { sockets.splice(sockets.indexOf(socket), 1); updateRoster(); }); socket.on('message', function (msg) { var text = String(msg || ''); if (!text) return; socket.get('name', function (err, name) { var data = { name: name, text: text }; // -------------------------------------------------------- // ここから // -------------------------------------------------------- // DBに登録 var post = new Post(); post.name = name; post.text = text; post.save(function(err){ if(!err){ console.log("saved! name:" + name + ",text:" + text); } }); // -------------------------------------------------------- // ここまで // -------------------------------------------------------- broadcast('message', data); messages.push(data); }); }); socket.on('identify', function (name) { socket.set('name', String(name || 'Anonymous'), function (err) { updateRoster(); }); }); }); function updateRoster() { async.map( sockets, function (socket, callback) { socket.get('name', callback); }, function (err, names) { broadcast('roster', names); } ); } function broadcast(event, data) { sockets.forEach(function (socket) { socket.emit(event, data); }); } server.listen(process.env.PORT || 3000, process.env.IP || "0.0.0.0", function(){ var addr = server.address(); console.log("Chat server listening at", addr.address + ":" + addr.port); }); |
これでアプリを一旦終了し、再度実行してもメッセージ内容が保持されるようになった。