【Node.js+Express+PostgreSQL】ExpressにPostgreSQLを導入

# 背景
DBに接続するWebアプリケーション開発をしたい。
使い慣れているExpressと、最終的にHerokuで公開することを考慮してPostgreSQLを使いたい。
なお、自分用のメモみたいな感じで書いているので、その点はご了承いただきたい。

## 環境
* Windows 10
* Express 4.16.0
* PostgreSQL 11.3
* pg 7.11.0

## PostgreSQLのインストール
「PostgreSQL インストール」でググると、方法が出てくるのでそれらを参考にしてください。

## サンプル用のデータベース用意

1. ``mydb``というデータベースを作成。

```:command
psql -U postgres mydb
パスワード: 
```
パスワードは、PostgreSQLインストール時に指定したものを入力。
入力時、何も入力されていないように見えるが、正しいパスワードを入力してEnterキーを押せば、データベースに接続できる。

-
2. ``staff``テーブルの作成。

```:command
CREATE TABLE Staff (
id    CHAR(4)    NOT NULL,
name   TEXT       NOT NULL,
age    INTEGER    ,
PRIMARY KEY (id));
```
-
3. ``staff``テーブルに適当にレコード作成

```:command
INSERT INTO staff VALUES (1, 'taro', 21), (2, 'Jiro', 20), (3, 'Saburo', 18);
```
-
4. レコードが作成できたか一応確認

```:command
SELECT * FROM staff;
```


## アプリケーションの作成
1. 適当に名前をつけてExpressアプリケーションを作成。

```:command
express -e practice_postgres
cd practice_postgres
npm install
```
-
2. 今回必要なモジュール``node-postgres``のインストール。

```:command
npm install pg --save
```
-
3. クライアント側の記述

```html:index.ejs
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
    <p><%= datas %></p>
  </body>
</html>
```
-
4. サーバ側の記述

```js:index.js
var express = require('express');
var router = express.Router();
var pg = require('pg');

router.get('/', function(req, res, next) {
  var pool = pg.Pool({
    database: 'mydb',
    user: 'postgres', //ユーザー名はデフォルト以外を利用している人は適宜変更してください。
    password: 'PASSWORD', //PASSWORDにはPostgreSQLをインストールした際に設定したパスワードを記述。
    host: 'localhost',
    port: 5432,
  });
  pool.connect( function(err, client) {
    if (err) {
      console.log(err);
    } else {
      client.query('SELECT name FROM staff', function (err, result) {
        res.render('index', {
          title: 'Express',
          datas: result.rows[0].name,
        });
        console.log(result); //コンソール上での確認用なため、この1文は必須ではない。
      });
    }
  });
});

module.exports = router;
```
ここでは、わかりやすくするために、``datas: result.rows[0].name,``の部分で``{id: 1, name: 'taro', age: 21}``から``Taro``を取得してクライアントで表示するようにしている。

-
5. 実行結果確認
上記のコードを記述したら、表示確認。

```:command
npm start
```
![20190611a.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363036/5bf4814c-0f6a-d7c4-da03-3193332e55a1.png)
上記のように表示されていれば成功。

## あとがき
PostgreSQLに関する知識がない状態から、メモ代わりに本記事を書いた。
とりあえず、ExpressからPostgreSQLに接続する必要最低限のことはできたので、今後はHeroku Postgresを使ってHeroku上でアプリケーションを公開する方法などを模索していく。
ご指摘などあれば、コメントによろしくお願いします。

## 追記
Heroku Postgresに接続する際は、Heroku Postgresにテーブルとレコードを作成した後、以下のコードの``database``などの情報をHeroku上に載っているもの（※）に書き換える。
※herokuのアプリ＞Resources＞Heroku Postgres＞Settings、から閲覧可能。

```js:index.js
var pool = pg.Pool({
    database: 'mydb',
    user: 'postgres', //ユーザー名はデフォルト以外を利用している人は適宜変更してください。
    password: 'PASSWORD', //PASSWORDにはPostgreSQLをインストールした際に設定したパスワードを記述。
    host: 'localhost',
    port: 5432,
  });
```

また、``host: localhost``のままだと、エラー吐かれる。

## 追記2
Heroku Postgresへの接続は、[こちらの記事](https://qiita.com/c6tower/items/f9beed0bcf83e0705e8c)で詳しくまとめた。

## 追記3
``async/await``使うパターンは、[こちらの記事](https://qiita.com/c6tower/items/98fe6fdac87c3eaee40a)でまとめた。

## 追記4
SQLのトランザクションを考慮したコードを、[こちらの記事](https://qiita.com/c6tower/items/b269cfa6f9dd066b885b)でまとめた。
この記事のコードは汎用性の高いもの、などと勝手に思っている。

## 参考文献
* https://www.postgresql.jp/document/11/html/
    * PostgreSQLの使い方（公式だけど、わかりにくい）
* https://qiita.com/aoi_erimiya/items/a37890fb4719357f7f87
    * PostgreSQLの使い方（こちらのほうが参考になる）
* https://qiita.com/Shitimi_613/items/bcd6a7f4134e6a8f0621
    * PostgreSQLのコマンド一覧
* https://node-postgres.com/features/connecting
    * node-postgresモジュール
* http://hiyo-ac.hatenablog.com/entry/2018/01/28/141831
    * Node.jsでDBに接続するアプリのサンプルコード載っている（参考になる！）