【55:Node.js & MongoDB入門】Node.jsで掲示板アプリ+Node.jsからMongoDBへアクセス
プロジェクトNo.55:Node.js & MongoDB入門
ソーシャルゲームやチャットアプリなんかでよく使われているというNode.js。
これは勉強しておかなくては!ということで、いつも通りドットインストールさんのレッスンを一先ず修了。
要点とうまくいかなかった点をメモ書き程度に残しておきます。
ローカル開発環境の準備
こちらもドットインストールさんのレッスンを参考に下記ソフトウェアをダウンロード&インストール。
- VirtualBox (v5.0.16):仮想化ソフト
- Vagrant (1.8.1):仮想環境の構成を簡単に構築、共有できるツール
- CentOS (Vagrant上)
(下記のソフトウェアはNode.jsに直接関係なし)
Node.js
今回使用したのはv5.10.1。
大量のアクセスに対応する仕組みと、リアルタイムな通信が注目されている。
nodebrewのインストール
まずはNode.jsをインストールする前に、バージョン管理ツールを入れます。
nodebrewはNode.js専用のバージョン管理ツール。
$ curl -L git.io/nodebrew | perl - setup
PATHの追加
$ sudo vi /etc/bashrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
設定の読み込み
$ source ~/.basic
確認
$ nodebrew --version
Node.js
インストール(安定版)
$ nodebrew install-binary stable
node.jsのバージョンを指定(v5.10.1の場合)
$ nodebrew use v5.10.1
確認
$ node -v
npm
バージョンは3.8.3。
Node.jsをインストールすると同梱している、パッケージマネージャー。
EJS
HTMLを生成するテンプレートエンジン。
ざっくり言うとPHPみたいな事をJavaScriptでできる。
MongoDB
リポジトリを追加(バージョン3.2の場合)
$ sudo vim /etc/yum.repos.d/mongodb.repo
[mongodb-org-3.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
インストール(安定版)
$ sudo yum install -y mongodb-org
起動
$ sudo /etc/init.d/mongod start
停止
$ sudo /etc/init.d/mongod stop
mongoと入力して以下のようなエラーになる場合
MongoDB shell version: 3.2.5 connecting to: test 2016-04-14T14:17:47.935+0000 W NETWORK [thread1] Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused 2016-04-14T14:17:47.935+0000 E QUERY [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed : connect@src/mongo/shell/mongo.js:229:14 @(connect):1:6 exception: connect failed
データベースのパスが間違っているため、パスの設定をする
$ sudo mkdir /var/db/mongo $ sudo mongod --dbpath /var/db/mongo
Node.jsからMongoDB接続時にMongoError connect ECONNREFUSEDとなる場合の対処法
Node.jsでハマったところ
ドットインストールの#11〜13で作る「一行掲示板」だが、バージョンが違うせいか動作しなかった。(formからの受信したデータの末尾にnullという文字列が追加される。キャストされるはずなんだが。。。)
動画ではEvent: 'readable'を使っていますが、Event: 'data'で書き直して動作しました。
// イベント設定 server.on('request', function(req, res){ if(req.method === 'POST'){ // postした場合 var body = ""; req.on("data", function(data){ // formからのデータ受信している間 body += data; }); req.on("end", function(){ // 全ての受信が終わった時 // 受信データをqueryに変換 var query = qs.parse(body); // nameの値をpostsに格納 posts.push(query.name); renderForm(posts, res); }); }else{ // postされていない場合 renderForm(posts, res); } });