DataBaseJavaScriptLinuxMongoDBnode.jsサーバー構築プログラム

サーバー構築5 mongooseの導入

node.js向けに開発されたMongoDBアクセスライブラリmongooseをインストールします。mongooseはMongoDBにスキーマを定義して利用する。スキーマはデータ構造を一律に同様にする仕組み。

1.mongooseのインストール

AWSのアプリケーションインスタンスにログインして以下をコマンド入力。

sudo npm install mongoose --save-dev

app.jsに以下の記述をして、mogooseをExpressで利用できるようにする。

const mongoose = require('mongoose');

mongoose.connect()の第1引数には接続するmongoDBのURLを渡す。以下の場合はMongoDBがdefaultで使用するPort:27017のchatappというデータベースに接続することを指定している。

以下を記述

mongoose.connect('mongodb://ipアドレス:ポート番号/chatapp', (err) => {
      if(err){
            console.error(err);
      }else{
            console.log("MongoDBに接続できました");
      }
});

2.schemaの作成

スキーマ用のフォルダを作成

mkdir schema
cd schema

スキーマ用のファイルを作成

touch Account.js

Windowsの場合は新規ファイル作成でMessage.jsを作成する

Account.jsを編集する。

const mongoose = require('mongoose');

const Account = mongoose.Schema({
      username: String,
      mailaddress: String,
      pointNow: Number,
      password: String,
      date: {type: Date, default: new Date()}
});
module.exports = mongoose.model("Account", Account);

スキーマのタイプはここで詳細確認して下さい。

3.作成したスキーマをインポートする

app.jsに作成したスキーマを読み込む記述をします。

const Account = require('./schema/Account');

スキーマにデータを格納する記述をします。

const newAccount = new Account({
      username: req.body.username,
      mailaddress: req.body.mailaddress,
      pointNow: req.body.pointNow,
      password: req.body.password
});

作成したデータをデータベースに保存する。

スキーマに適合しないデータはコールバック関数からエラーオブジェクトが返されるので、if文で検知しthrow文で処理します。エラーが無い場合エラーオブジェクトはnullになるのでif文は発火しない。その後、returnで”/”にリダイレクトさせてます。

newAccount.save((err)=>{
      if(err) throw err;
      return res.redirect("/");
});

4.投稿用のフォームを作成する

viewsフォルダ内に投稿用のフォームテンプレートを作成します。

touch views/update_admin.pug

Windowsではviewsフォルダ内にupdate_admin.pugというファイルを作成する。

doctype html
html(lang="ja")
      head
            meta(charset="utf-8")
      body
            h1 メッセージを保存
            form(action="update" method="POST")
                  input(type="text" name="username" placeholder="名前")
                  input(type="email" name="mailaddress" placeholder="メールアドレス")
                  input(type="number" name="pointNow" placeholder="付与ポイント")
                  input (type="password" name="password" placeholder="パスワード")
                  button(type="submit") 送信

5.ルーティングを設定

app.js内にupdate_adminのルーティングを記載する。

app.get("/update_admin", (req, res, next) => {
      return res.render('update');
});

app.post("/update_admin", (req, res, next) => {

      const newAccount = new Account({
            username: req.body.username,
            mailaddress: req.body.mailaddress,
            pointNow: req.body.pointNow,
            password: req.body.password
      });
      newAccount.save((err)=>{
            if(err) throw err;
            return res.redirect("/");
      });
});

6.body-parserミドルウェアの導入

ExpressにはdefaultでPOST形式のリクエストのボディーをパース出来ないので、このままではサーバーがユーザーの投稿を取得できずにエラーになります。そのためにPOST形式のリクエストで送られてきたユーザーの投稿内容を取得する処理を自動的に行うbody-parserをミドルウェアとして使用します。body-parserはPOST形式の中でも、application/jsonなどのリクエスト形式から、個別の送信された各要素をパースして、req.bodyオブジェクトに結果を格納するものです。

body-parserをインストールする

sudo npm i -g body-parser --save-dev

app.jsにミドルウェアの設定する。

const bodyparser = require('body-parser');
app.use(bodyparser());

これでデータベースにデータを保存することができるようになりました。

7.MongoDBからデータを取得

データを保存や取得する場合はまずスキーマをインポートする。

const Account = require('./schema/Account');

アカウント一覧をトップページへ記載するため”/”へのルーティングを記載する。

app.js内のapp.get(“/”….内をいかに変更する。

app.get("/", (req, res, next) => {
      Account.find({}, (err, msgs) => {
            if(err) throw err;
            return res.render('index', {messages: msgs});
      });
});

MongoDBのクエリの形式は基本的に、第1引数にオブジェクト形式でクエリを設定して、最後の引数に結果を取得するためのコールバック関数を設定する形式。

エラーオブジェクトは必ずコールバック関数の第1引数になり、第2引数に結果が配列方式で格納されている。クエリに該当するデータが無い時は空の配列が返ってきます。上記の場合は全ての投稿を取得するためにクエリを空にしています。上記のルーティングではエラーが発生した場合は例外を投げて404エラーを返すように設定されています。そうでなければ投稿一覧のデータをテンプレートエンジンに渡します。

8.テンプレートエンジンでのデータの整形

受け取ったデータをeach構文で取り出して整形します。基本的な構文は、

each msg in {配列}

上記のようになります。この構文で取り出した変数名を指定します。views/index.pugの内容を以下のように変更します。

doctype html
html(lang="ja")
      head
            meta(charset="utf-8")
      body
            h1 アカウント一覧
            section
                  each msg in accounts
                        div
                              h2 #{msg.username}
                              b #{msg.mailaddress}
                              br
                              b #{msg.pointNow}
                              br
                              b #{msg.password}
                              br
                              time #{msg.date}

 

コメントを残す