Node.js × Heroku Postgres を試してみる

# はじめに
Node.jsでRDBSを試してみたいが、有料のDBサーバは使用したくないと思い、Heroku Postgres の無料枠で軽く試してみた際の備忘録になります。
修正点やアドバイスなどありましたらコメントいただけますと幸いです。

# バージョン
- Node : 14.17.1

# 手順
下記の手順で作成していきます。

1. Heroku Postgres 作成
2. Node.jsで設定を行う

# 1. Heroku Postgres 作成
まずはHerokuでDBを作成していきます。
今回はUI上から作成していきます。（CLIを使用することも可能）

### 1-1. 新規appの作成
下記画面の「New」から「Create new app」を選択して、新規appを作成します。
https://dashboard.heroku.com/apps
![new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533014/f33403df-88f6-3693-ee75-582c5ab880f2.png)

新規app作成画面で適当なapp名をつけ、「Create app」をクリックします。
![create_new_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533014/d8043f21-0a54-9386-2ad8-8d4594059b47.png)
※ app名はHeroku内で一意である必要がある（**他のユーザとも被ってはならない**）ので、注意が必要です。

### 1-2. appに紐づく Heroku Postgres の作成
appの作成が完了したら、そのappに紐づく Heroku Postgres を作成します。

下記app一覧画面から、1-1で作成したappを選択します。
https://dashboard.heroku.com/apps

対象appの画面で、「Resource」タブの「Add-ons」の項目から「Heroku Postgres」を検索・選択します。
![add-on.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533014/b7d41f44-fa19-03e8-f83c-8b59ceadb2fb.png)

新規 Heroku Postgres 作成画面のプランは「Hobby Dev - Free」を選択し、「Submit Order Form」をクリックします。
![plan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533014/9cf585ed-723f-1137-ec40-c2a31d4ae82c.png)

### 1-3. DBの接続情報の取得
DBの作成が完了したら、接続に必要な情報を取得します。

下記URLから、1-2で作成したDBを選択します。
https://data.heroku.com/

選択後、「Setting」タブの「View Credentials...」から接続情報を参照することができます。
![view_credentials.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533014/dc6550c1-1795-c2f8-fab0-ce955fb6a83d.png)

# 2. Node.jsで設定を行う
次に、Node.jsで作成したDBに接続するための設定をしていきます。
以下ではNode.jsのインストールが前提となっておりますので、未インストールの方は[公式ページ](https://nodejs.org/ja/download/)や[Homebrew](https://formulae.brew.sh/formula/node)などからインストールをお願いいたします。

### 2-1. 必要なモジュールのインストール
今回は下記の2つのモジュールを使用します。

* **node-postgres** : Node.jsでPostgreSQLを使用するためのモジュール
* **dotenv** : .envファイルの値を使用するためのモジュール

下記コマンドでインストールします。

```console
npm install pg
npm install dotenv
```

### 2-2. .envファイルの作成
.envファイルを作成し、1-3で取得した接続情報を記述します。
下記の中から必要なものだけ記述してください。

```:.env
DB_HOST={ Host }
DB_DATBASE={ Database }
DB_USER={ User }
DB_PORT={ Port }
DB_PASS={ Password }
DB_URL={ URI }
```

### 2-3. javascriptファイルの作成
実行ファイルを作成します。
DB接続情報の記述方法は[こちら](https://devcenter.heroku.com/articles/heroku-postgresql#connecting-in-node-js)を参考にしてください。

```javascript:sample.js
require('dotenv').config();

const { Client } = require('pg');

// DB_URLを使用
const client = new Client({
  connectionString: process.env.DB_URL,
  ssl: {
    rejectUnauthorized: false
  }
});

// 接続
client.connect();

// 現在時刻を取得
client.query('SELECT NOW()', (err, res) => {
  if (err) throw err;
  for (let row of res.rows) {
    console.log(JSON.stringify(row));
  }
  // 接続終了
  client.end();
});
```

上記例では `DB_URL` を使用して接続していますが、`DB_HOST` などを使用して下記のように書くこともできます。

```javascript:sample.js（一部）
const client = new Client({
  user: process.env.DB_USER,
  host: process.env.DB_HOST,
  database: process.env.DB_DATBASE,
  password: process.env.DB_PASS,
  port: process.env.DB_PORT,
  ssl: {
    rejectUnauthorized: false
  }
});
```

設定の書き方については下記を参考にしてください。

* https://node-postgres.com/api/client
* https://node-postgres.com/features/connecting

また、PostgreSQLのクエリに関しては下記を参考にしてください。

* https://www.postgresql.org/docs/14/sql-commands.html

# 参考
- [【Heroku】Heroku Postgres Add-on について](https://elements.heroku.com/addons/heroku-postgresql)
- [【Heroku】Heroku Postgres の設定方法](https://devcenter.heroku.com/articles/heroku-postgresql)
- [【node-postgres】Welcome](https://node-postgres.com/)