Node.jsによるアプリ開発
package.json
・package.jsonファイルとは、以下のような書式のファイルのこと。Node.jsベースのアプリ開発において、npmでパッケージを管理している。また、アプリの開発/実行時において必要なパッケージについて分かれている。
・node_modulesには、それぞれのライブラリーの実態が格納されている。そのバージョン情報については、node_modulesのjsファイルで管理しているわけではない。そういった情報は、package-lock.jsonに格納されている。
・プロジェクト中にpackage.jsonを見に行く機会は頻繁にある。例えば、開発中にどのような依存するライブラリーを使い、どのようなスクリプトを走らせるかなど、package.jsonファイルを覗きにいくことでプロジェクトの全体像が見える。例えばアプリをスタートしたときに、./bin/wwwでアプリを走らせていることがわかる。
・下記に記載されているnodemonというのは、自動でサーバを再起動させるモジュールのこと。例えばコードを書き換えて保存した際、すぐに結果をlocalhostへ反映するため、作業効率がアップする。
{
"name": "monsters_api",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"configure": "./bin/configuredb.sh",
"start": "node ./bin/www",
"dev": "nodemon ./bin/www"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"nodemon": "^2.0.7"
},
"dependencies": {
"body-parser": "^1.19.0",
"express": "^4.17.1",
"pg": "^8.5.1"
}
}
MVCフレームワーク
Node.jsというのはJSのサーバー側の言語である。そしてそこで簡単にHTTP通信をしてくれるライブラリーがExpressである。別の例を挙げると、Ruby on RailsのRailsがExpressのようなイメージで、RubyがNode.jsである。Railsが便利なものがまるっと含まれているライブラリーである。
Railsにおいては、Rubyと密結合になっている。一方でNode.jsとExpressは、Ruby on Railsと比較すると自由度が高い。Expressの他にもHTTP通信ができるライブラリーがある。
JavaScriptを覗くプログラミング言語については、基本的にサーバー言語である。C#, Python, JAVAなど。
.sh拡張子ファイル
シェルスクリプトの拡張子である。例えば以下のような記述をすると、node_userのmonstersdbというテーブルに対して、./bin/monsters.sqlを実行する、という意味である。
psql- U node_user monstersdb < ./bin/monsters.sql
#!/bin/bash
これはシェバングと言って、LINUXとかの歴史的都合上、どういったシェルスクリプトでLINUXを動かすか、ということを宣言しなければいけない(*例えばbashスクリプトとか。)宣言をすることで、以下の通りにbashスクリプトを実行できる。
#!/bin/bash
database="monstersdb"
echo "Configuring database: $database"
dropdb -U node_user monstersb
createdb -U node_user monstersb
psql -U node_user monstersdb < ./bin/monsters.sql
echo "$database configured"
pool.query
queryはライブラリーであり、queryの第一引数がエラー出力、第二引数がresである。そのため、err, resという順番で記載されている。
pool.query('SELECT * FROM monsters', (err, res) => {
if (err) return console.log(err);
console.log(res);
});
node db
例えばdbフォルダ内にindex.jsファイルがあるとすれば、そのdbフォルダを格納しているフォルダでnode dbを実行することで、index.jsファイルの呼び出しが可能である。
.gitignore
git自体にアップロードしたくないファイルがある。例えば、パスワードが記載されているファイルなど。もしくはnode_modulesなども、わざわざgitへアップロードしなくても、各ユーザが手元でインストールできる。そのため、こういったgitへあげる必要がないファイルは、.gitignoreで省力することが多い。
Error Handling in Express with Middleware
小規模のアプリでは必要ないが、大規模のアプリであれば、エラーハンドリングを共通化して個別のエラーをまとめてレスポンスを返した方がいい。こういったエラーレスポンスを返すだけ、という形にする。例えば全てのエラーをJSON表示にさせて返す、ということ。
そうすることによって、ログに対してエラーが起きた処理を書き加えることができる。起きたエラーを分類分けすることによって、cloudwatchへ流したり、slackへ流したり。そういった自動化処理をすることが、エラーハンドリングが可能となる。
Routing middleware in Express
routerというフォルダで、各ファイルへのルーティングを全て任せる。そして各フォルダで行う処理は、各ファイルにて実装する。こうやって書くことで、全体の見通しが良くなる。フォルダ構成を整理することで、誰が見ても一目で理解できるシステム設計となる。
put処理
[request.body[field], id]ここで、fieldで項目を指定している。そして実際に更新する値も格納しているので、UPDATE処理によって更新することが可能である。
router.put('/:id', (request, response, next) => {
const { id } = request.params;
const keys = ['name', 'personality'];
const fields = [];
keys.forEach(key => {
if (request.body[key]) fields.push(key);
});
fields.forEach((field, index) => {
pool.query(
`UPDATE monsters SET ${field}=($1) WHERE id=($2)`,
[request.body[field], id],
(err, res) => {
if (err) return next(err);
if (index === fields.length - 1) response.redirect('/monsters');
}
)
});
});