Node.jsによるアプリ開発

3 min read読了の目安(約3400字

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');
      }
    )
  });
});