Expressでアプリを作る1/3 -ExpressとNode.jsを使ってTodolistアプリを作る-
アレクサスキルをExpressを使って開発しようとするも、基礎的なことがわかってなさすぎてつまりまくってしまいました…
あとデプロイとかもよくわかっていなくて…まずはExpressでTodoListアプリを作ってデプロイする、というとこまでを実践してみたので、役立ちそうなポイントをメモしておきます。
実践内容としては、AWSを使用し、こんな構成で、アプリを作りました。

記事は以下の3部作になります。
- ExpressとNode.jsとMongoDBを使ってTodolistアプリを作る
- EC2とELBとR53などを使ってデプロイする
- Elastic Beanstalkを使ってデプロイしてみる
この記事では【1. ExpressとNode.jsとMongoDBを使ってTodolistアプリを作る】をまとめています。
1.ExpressとNode.jsを使ってTodolistアプリを作る
1-1.Expressとは
Node.jsのWebアプリケーションフレームワークで、Webアプリを作るためのひな形や骨組みのこと。
今回サンプルアプリを作るにあたって、mozillaのtutorialを参考にしました。英語ですが細かく書いてあってわかりやすかったので、Express x Node.js入門の際、ぜひ参考にしてみてください!
Express Tutorial: The Local Library website
Expressフレームワークの構成、各要素の役割は以下の通り。

新規のTodolistを作成する場合の流れを以下にまとめます。
まず、RoutesはHTTPメソッドとパスをControllerに紐づけます。 例えば、以下の例だと、’/create_todo’に対するPOSTでのHTTP Requestと、controllers/create_todo_controller.jsのcreate_todo_postメソッドを紐付けている。
var create_todo_controller = require('../controllers/createtodoController');
router.post('/create_todo', create_todo_controller.create_todo_post);
Modelsはアプリケーションに出てくる概念の持つデータと振るまいを定義します。 以下の例だとtodolistSchemaにtodolistの項目(宿題をする,etc)を定義しており、ふるまいに関してはmongooseの中でいろいろ定義されている。
//Require Mongoose
var mongoose = require('mongoose');
//Define a schema
var Schema = mongoose.Schema;
var todolistSchema = new Schema({
    item: { type: String, required: true, max: 100 },
    add_date: { type: Date },
    limit_date: { type: Date }
});
//Export model
module.exports = mongoose.model('ToDoList', todolistSchema );
createtodoController.jsのcreate_todo_postメソッドでは、新規のTodolistを作成する処理を記述。結果をテンプレートエンジンにレンダリングし、結果をHTMLで表示する。
const { body,validationResult } = require('express-validator/check');
const { sanitizeBody } = require('express-validator/filter');
var ToDoList = require('../models/todolist');
var async = require('async');
exports.create_todo_post = [
   
    // Validate that the item field is not empty.
    body('item', 'item name required').isLength({ min: 1 }).trim(),
    // Sanitize (trim and escape) the name field.
    sanitizeBody('item').trim().escape(),
    // Process request after validation and sanitization.
    (req, res, next) => {
        // Extract the validation errors from a request.
        const errors = validationResult(req);
        // Create a item object with escaped and trimmed data.
        var new_item = new ToDoList(
          { item: req.body.item }
        );
        if (!errors.isEmpty()) {  //= If there is error
            // There are errors. Render the form again with sanitized values/error messages.
            res.render('createtodo', { title: 'Create Todo',errors: errors.array()});
            return;
        }
    
        // Data from form is valid.
        // Check if item with same name already exists.
        ToDoList.findOne({ 'item': req.body.item })
            .exec( function(err, found_item) {
                    if (err) { return next(err);
                    if (found_item) {
                        // Item exists, render message.
                        res.render('error', {message: 'the item is already exist'});
                        return;
                    }
                    else {
                    new_item.save(function (err) {
                        if (err) { return next(err); }
                        // Item saved. Redirect to genre detail page.
                        res.render('create_result', {message: "'" +  new_item.item + "'" + " is added to ToDo List"});
                        });
                    }
                });
    }
];
1-2.MongoDBとは
MongoDBはNoSQLのデータベースです。NoSQLデータベースとしては、世界で一番使われているようです。 https://db-engines.com/en/ranking
Express Tutorial Part 3: Using a Database (with Mongoose)の中でも紹介されていますが、このアプリでは無料で使用できるmLab’sから利用しています。
このアプリでは、MongooseというMongoDBのモジュールを使用し、これを利用してデータベースにアクセスします。Mongooseは、ドキュメント指向のデータモデルを使用するオープンソースのNoSQLデータベースであるMongoDBのフロントエンドとして機能します。 http://mongoosejs.com/
1-3.できたもの
MozillaにのっていたExpressのチュートリアルを参考にしながら、一旦ローカルでこんな感じでアプリが完成しました。
アプリ全体のプログラムはこちら。 https://github.com/pistachiyoda/express-todolist/tree/default
[メモ] ユーザ名とかパスワードとがをコードに含めるとき
コード中にパスワードなどをそのまま含めるのはとても危険。そこで環境変数を利用して、プログラム中にはパスワードに対して環境変数を設定し、その環境変数の中身はサーバーに置いておくことで、セキュリティが保てます。 node.jsの場合だと、dotenvを使って、これを実現できます。
詳しくはこちら! https://www.npmjs.com/package/dotenv
次は、一旦ローカルで開発したこのアプリをデプロイしていきます!
