サイト -Web開発コース(Node.js) | Progate リンク
・Node.jsは本来クライアント側の言語であるJavaScriptをサーバーサイドで動かすための仕組み ・ExpressはNode.jsでWebアプリの開発をするためのフレームワーク ・パッケージを用意するにはnpm (Node Package Manager)というシステムを使い ・listenメソッドを用意してapp.jsファイルを実行するとサーバーを起動する ・URLに対応する処理を実行することをルーティングという ・ブラウザに表示する見た目部分にはEJSという形式のファイルを使い、viewsフォルダに配置する(ビューファイルと呼称) ・EJSはHTMLとJavaScriptのコード両方を記述できるNode.jsのパッケージ |
・public |
CSSや画像
|
・views |
ビューファイル(EJS形式) EJSは、HTMLの中にJavaScriptを記述できるNode.jsのパッケージ
|
・app.js |
ルーティング
|
$ npm install express | npmを利用してexpressパッケージをインストール |
$ npm install ejs | npmを利用してejsパッケージをインストール |
$ npm install mysql | npmを利用してmysqlsパッケージをインストール |
$ node app.js | npmを利用してapp.jsを実行(サーバ起動) |
ブラウザでlocalhost:3000にアクセスすると、app.jsで'/'がルーティングされる |
1 | Expressの読み込み |
2 | Expressを使用するための準備 |
4 |
publicフォルダー内のファイル(CSSや画像など)を取り込む。ビューファイルの実装方法は「top.ejs」参照 |
6 |
「/」のURLをルートURLという。一番初めにアクセスするページはルートURLに設定することが一般的 ルーティングの処理では、req(リクエスト)・res(レスポンス)の2つの引数を受け取る |
7 |
ルーティングの処理でres.renderと書くことで、指定したビューファイルをブラウザに表示できる |
10 | localhost:3000でアクセス可能なサーバーを起動 |
6 | cssの取り込み |
22 | 画像の取り込み |
19 | トップ画面で「一覧を見る」ボタンを押下すると、app.jsで'/index'がルーティングされる |
2 | MySQLパッケージを読み込む |
7 | 定数connectionを定義して接続情報の書かれたコードを代入 |
15 |
connection.query('クエリ', クエリ実行後の処理)と書くことで、 Node.jsからデータベースに対してクエリを実行することができる |
17 |
クエリ実行後は2つの引数を取ることができる ・error:クエリが失敗したときのエラー情報 ・results:クエリの実行結果 |
18 |
renderメソッドの第2引数に{プロパティ : 値}と書くことで、 EJS側に値を渡すことができる。EJS側ではプロパティで値を使える 「<% items.forEach((item) => { %>」 |
INSERT時、itemsテーブルのidにはAUTO INCREMENT(オートインクリメント) を設定しているので、idの値を指定する必要がない
AUTO INCREMENTは「自動増加」という意味で、AUTO INCREMENTを設定し たカラムに自動で番号を割り当てる |
24 |
<% %>で囲んだ場合はブラウザに何も表示されないので、 変数の定義などに用いる
EJSでforEachを利用する繰り返し処理が可能になりHTMLを直接記述するよりもスッキリ書くことができる
|
27 |
変数の値などをブラウザに表示したい場合は<%= %>を用いる
|
16 | 一覧画面で「新規登録」ボタンを押下すると、app.jsで'/new'がルーティングされる |
11 |
トップ画面に戻る
|
19 |
フォーム送信して登録する
|
24 |
一覧画面に戻る
|
19 |
formのaction、methodはルーティングにあわせる
|
20 |
input要素にname属性を指定すると、オブジェクトの形で情報がサーバーに送信される
|
21 |
新規登録画面で「作成する」ボタンを押下すると、app.jsで'/create'がルーティングされる
|
6 | フォームの値を受け取るにはapp.jsでこのソースコードを追加する必要がある |
32 |
getメソッド:画面を表示したいときに使用する postメソッド:データベースを更新したいときに使用する |
34 |
フォームからの値をクエリに使うときは、VALUESに「?」を含める connection.query()の第2引数に渡したい配列を指定。この配列の要素が「?」の部分に入る |
35 | req.body.itemNameでフォームの値を取得できる。「itemName」はinput要素のname属性 |
37 |
redirect 登録処理後は一覧画面に遷移する。一覧画面に戻ったあとブラウザをリロードするとメモが増えてしまう。リロードは直前のリクエストを実行する機能。そのため一覧表示と一緒に追加処理も実行されてしまう。この問題を解決するためにリダイレクトを行う |
31 |
formのaction、methodはルーティングにあわせる ルーティングに合わせてフォームの送信先URLにメモのidを含める |
32 | 一覧画面の明細で「削除」ボタンを押下すると、app.jsで'/delete'がルーティングされる |
34 | リクエストがDB更新の場合はformタグ、画面遷移の場合はaタグを使用する |
42 |
データベースを更新する処理なのでpostメソッドを使用する。メモのidを受け渡すためルーティングのURLは/delete/:idのように指定する。/:idの部分をルートパラメータと呼ぶ |
45 | req.params.ルートパラメータ名でルートパラメータの値を受け取ることができる |
47 |
削除機能はデータベースを変更する処理なので、新規登録と同様に リダイレクトを用いて一覧画面を表示させる |
【一覧画面の表示(ボタン箇所)の場合】 | |
34 |
ルーティングに合わせてリンクの送信先URLにメモのid を含める |
【編集画面に遷移の場合】 | |
34 | 一覧画面の明細で「編集」ボタンを押下すると、app.jsで'/edit'がルーティングされる |
52 |
画面遷移する処理なのでgetメソッドを使用する。メモのidを受け渡すためルーティングのURLは/edit/:idのように指定する |
55 | req.params.ルートパラメータ名でルートパラメータの値を受け取ることができる |
57 |
renderメソッドの第2引数に{プロパティ : 値}と書くことで、EJS側に値を渡すことができる。配列resultsから1件目の要素を取り出し、dit.ejsにitemプロパティを渡すクエリの取得結果は件数に関わらず配列になるので1件目の要素は「results[0]」と指定する |
11 | トップ画面に戻る |
19 | フォーム送信して編集する |
20 | value属性に値を指定するとフォームに初期値を表示できる |
24 | 一覧画面に戻る |
21 | 編集画面で「更新する」ボタンを押下すると、app.jsで'/update'がルーティングされる |
62 |
データベースを更新する処理なのでpostメソッドを使用する ルーティングのURLは/update/:idのようにルートパラメータを渡す |
64 | クエリに複数の値を入れる時は配列の要素を増やす。配列の要素の順番通りに?に入る |
65 |
req.params.idでURLのルートパラメータの値を受け取る。「id」はURLの「/:id」req.body.itemNameでフォームの値を取得できる。「itemName」はinput要素のname属性 |
67 |
編集機能はデータベースを変更する処理なので、新規登録と同様に リダイレクトを用いて一覧画面を表示させる |