TODO 管理アプリ
書籍「作りながら学ぶWebプログラミング実践入門」の Chapter7 を作成したリポジトリ
https://book.mynavi.jp/ec/products/detail/id=112778
- HTML
- CSS
- JavaScript
- Node.js
- バックエンド
- Express
- Node.js で Web アプリを開発するためのフレームワーク
- SQLite3
- データベース
- express-generator
- Express のプロジェクトを自動生成してくれるツール
- グローバル環境にインストールする
- $ npm install express-generator -g
- express-session
- Express でセッションを扱うためのパッケージ
- $ npm install --save express-session
- sqlite3
- Node で SQLite3 を扱うためのパッケージ
- $ npm install --save sqlite3
- id
- プライマリーキー
- account
- アカウント名. メールアドレス等
- password
- パスワード
- name
- 名前
- role
- 一般利用者(user)か管理者(admin)かを区別する
- id
- プライマリーキー
- user_id
- ToDo を作成した利用者の id
- title
- ToDo のタイトル
- memo
- ToDo の内容
- posted
- 投稿した日時
- finished
- 終了する日時
- checked
- 既に完了した ToDo かどうかを表す
- priority
- タスクの優先度
- 1, 2, 3 の3段階
- 1 が最高優先度で 3 が最低優先度
$ npm start
を実行しサーバを起動する- ブラウザのアドレスバーに
http://localhost:3000
を入力しアクセス
テンプレートエンジンに ejs
を指定した場合の使用方法
- views フォルダの中に html のベースとなるテンプレートファイル(.ejs)を作成する
- routes フォルダの中に
.js
ファイルを作成しそこにクライアントからアクセスがあった場合の制御を書く- router.get/routes.post で各 http メソッドの処理を定義する
- テンプレートを使ったレンダリングもここで行う
res.render('users' ,{...})
とすればusers.ejs
をベースにレンダリングする
- router.get/router.post の引数で指定するパスはその router モジュールをルートとした相対パスで指定する
- ルートが
users
の場合に/hoge
を引数に指定した場合はhttp://localhost:3000/users/hoge
となる
- ルートが
- app.js に以下のコードを追記する
var xxxRouter = require('./routes/xxx');
app.use('/xxx', xxxRouter);
- routes フォルダ
- ルーティングに関するスクリプトがまとめられている. このアドレスにアクセスしたらこの処理を実行するなど制御している
- views フォルダ
- Web ページの元となるテンプレートをまとめる
- ejs は HTML がベースとなる
- app.js
- Web アプリの本体となるスクリプト
- 外部パッケージの require
- ルーティングの追加
- etc
- node_modules
- プロジェクトが依存するパッケージ群
package.json
で管理されており、npm install でインストールできるためバージョン管理対象外でよい
Mocha というユニットテスト用のフレームワークを使用する
# mocha をインストール
$ npm install mocha --save-dev
# プロジェクト直下の test ディレクトリ内にある .js ファイルを対象に mocha はテストするためフォルダを作成する
$ mkdir test
# テストモジュール作成
$ touch ./test/test-sample.js
$ npx mocha
sequelize は Node.js 用の OR マッパー
$ npm install sequelize
sequelize を便利に使用するための CLI ツール
$ npm install sequelize-cli
$ npx sequelize-cli init
- config
- 設定情報管理
- models
- データベースアクセスに使う「モデル」というオブジェクトを定義する
{
"development": {
"database": "db-development",
"dialect": "sqlite",
"storage": "seq-todo.sqlite3"
},
"test": {
"database": "db-test",
"dialect": "sqlite",
"storage": "seq-todo.sqlite3"
},
"production": {
"database": "db-product",
"dialect": "sqlite",
"storage": "seq-todo.sqlite3"
}
}
$ npx sequelize-cli model:generate --name users --attributes account:string,password:string,name:string,role:string
以下が生成される
- models/users.js
- migrations/yyyymmddxxxxxxxx-create-users.js
データベースの内容を変更した場合にその差分をデータベースに適用する. 今回は新たにモデルを作成したため、その変更をデータベースに反映する. これによりモデルを作成した users テーブルが seq-todo.db に作成される.
$ npx sequelize-cli db:migrate --env development
シーディング作成用のスクリプトファイルを生成する
$ npx sequelize-cli seed:generate --name sample-users
seeders/yyyymmddxxxxxxxx-sample-users.js が生成されているためその up
に生成するレコードの情報を記述する.
up: async (queryInterface, Sequelize) => {
return queryInterface.bulkInsert('users', [
{
account: 'admin.com',
password: 'admin',
name: 'admin',
role: 'admin',
createdAt: new Date(),
updatedAt: new Date()
}
]);
/**
* Add seed commands here.
*
* Example:
* await queryInterface.bulkInsert('People', [{
* name: 'John Doe',
* isBetaMember: false
* }], {});
*/
},
シーディングを実行する
$ npx sequelize-cli db:seed:all