Node.jsでのHerokuチュートリアル後編

後編です。
前編はこちら
https://qiita.com/shti_f/items/b4b5d830672d908eff4e

## 拡張機能(add-on)を使用する(上)

第３者によって作られた、型にとらわれない拡張機能を追加することができます。

デフォルトでは、Herokuはあなたのアプリに対して1500行ものログを持っています。しかしこのことは、それらログを訳すこともサービスになりうることを意味しています。ログの拡張機能の中には、パースや検索、アラートなどの機能があるものもあります。

このステップでは、そんなログの拡張機能の一つ、[Papertrail](https://devcenter.heroku.com/articles/papertrail) を導入してみましょう。

```
$ heroku addons:create papertrail
Creating papertrail on ⬢ sharp-rain-871... !
 ▸    Please verify your account to install this add-on plan (please enter a credit card) For more information, see https://devcenter.heroku.com/categories/billing Verify now at
 ▸    https://heroku.com/verify
```

クレジットカードを登録していない場合、アカウントの検証([account verification](https://devcenter.heroku.com/articles/account-verification))が必要とされます。

## アカウントの検証(Accoutn Verification)

少しチュートリアルから逸れますが、アカウント検証について触れます。
検証が必要となるシーンは、

- 複数のdynoを一つのアプリで使用する時
- 拡張機能(add-on)を使用する時
 - これは使用する拡張機能が無料のものでも必要になります。
 - ただし、Heroku Postgres と Heroku Connect の無料拡張機能に限ってアカウント検証なしで使用できます。
- アプリに[カスタムドメイン](https://devcenter.heroku.com/articles/custom-domains)を使用する時
- 有料のリソースを用いたアプリを受け渡し([transferring](https://devcenter.heroku.com/articles/transferring-apps))された時
- dyno([one-off dyno](https://devcenter.heroku.com/articles/dyno-types#concurrent-one-off-dyno-limits))の使用数が制限数を上回った時
 - アカウント検証なしでは３つが上限です。
- 一度に５個より多いアプリを持っている時
 - 検証後は上限値が100個になります。

です。

今回は２つ目の条件に当たります。
Papertrailの無料プランを使いますが、Heroku Postgres でも Heroku Connect でもないので、クレジットカードを登録する必要があります。

### 登録方法
[Account Setting](https://dashboard.heroku.com/account)にいき、**Billing**というタブを開くと、**Add Credit Card**というボタンがあるので、それを押しましょう。

<img width="1257" alt="Add Credit Card.png" src="https://qiita-image-store.s3.amazonaws.com/0/147715/52f5ce97-60c4-d619-a8ba-a48eff9bc2f1.png">

ちなみに Billing Address Line は請求先住所のことです。
余談ですが Kyash のクレジットカードは登録できませんでした。

##拡張機能を使用する(下)

では、改めて Papertrail を導入してみましょう。

```
$ heroku addons:create papertrail
Creating papertrail on ⬢ sharp-rain-871... free
Welcome to Papertrail. Questions and ideas are welcome (support@papertrailapp.com). Happy logging!
Created papertrail-pointy-xxxxx as PAPERTRAIL_API_TOKEN
Use heroku addons:docs papertrail to view documentation
```

`adons`というコマンドを使って、アドオンをリストアップできます。
choklad はスウェーデン語でチョコレートのことで、Papertrail の無料プランの名前になっています。

```
$ heroku addons

Add-on                                Plan     Price  State
────────────────────────────────────  ───────  ─────  ───────
papertrail (papertrail-pointy-xxxxx)  choklad  free   created
 └─ as PAPERTRAIL

The table above shows add-ons and the attachments to the current app (sharp-rain-871) or other apps.
```

実際にPapertrailを使ってみます。

```
$ heroku addons:open papertrail
Opening https://addons-sso.heroku.com/apps/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/addons/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx...
```

利用規約が変わったそうなので、読んで agree

<img width="1086" alt="SSA.png" src="https://qiita-image-store.s3.amazonaws.com/0/147715/21ca919a-b8a7-a0d7-f196-f28b284a0b28.png">

とりあえず、今回はテストで、メールを送られても困るので`No, thanks`を選択。
<img width="795" alt="no thanks.png" src="https://qiita-image-store.s3.amazonaws.com/0/147715/631486b7-f5d3-0751-0bea-fb77dd37b0c8.png">

ブラウザ上で、こうしてログを見ることができます。
アクセスをしないとログが動かないので`heroku open`をして、飛んだりしてみましょう。

![Papertrail logs.png](https://qiita-image-store.s3.amazonaws.com/0/147715/60d3af89-0cb6-e11c-a7ff-7c09da6cbd1f.png)

## コンソールに入る
`run bash`をすると dyno 上の shell に入ることができます。

```
$ heroku run bash
Running bash on ⬢ sharp-rain-871... up, run.3036 (Free)
~ $ ls
Procfile  README.md  app.json  index.js  node_modules  package-lock.json  package.json  public  test.js  views
~ $ exit
exit
```

もし`Error connecting to process`というエラーが出たら[ファイアーウォールの設定](https://devcenter.heroku.com/articles/one-off-dynos#timeout-awaiting-process)をしましょう。

`exit`コマンドで終了するのを忘れないでください。

#### (ヘルプ要請)
原文にはもう少し違うことが書いてあるんですが、いまいちよく分からなかったので、どなたか編集リクエスト、コメント等送っていただけると嬉しいです。
原文->https://devcenter.heroku.com/articles/getting-started-with-nodejs#start-a-console
一応訳しておきます。

dyno がどのように動くかを、より実感したいのであれば、別の one-off dyno を作成し、`bash`コマンドを走らせてみましょう。その dyno 上で bash が開き、そこでコマンドを実行することができます。それぞれの dyno はアプリや依存モジュールの入った、一時的なファイルスペースを個別に持っていて、コマンド（この場合は`bash`コマンド）の完了と共にその dyno は削除されます。

## 設定変数(Config Vars)の宣言

Herokuでは、設定変数([config vars](https://devcenter.heroku.com/articles/config-vars))を用いることで、暗号のキーや外部ファイルへのリンクなど重要な変数を切り離すことができます。

ランライムにおいて、設定変数はアプリ内の環境変数として作用します。
例として、`index.js`に新しいroute、`/times`を用意してみましょう。`TIMES`という環境変数の数だけアクションを繰り返すようなプログラムにします。

routeを追加します。

```index.js
.get('/times', (req, res) => res.send(showTimes()))
```

ファイルの最後に関数を用意します。

```index.js
showTimes = () => {
  let result = ''
  const times = process.env.TIMES || 5
  for (i = 0; i < times; i++) {
    result += i + ' '
  }
  return result;
}
```
`heroku  local`ではローカルにある`.env`ファイルをもとに環境変数を設定します。プロジェクトのトップレベルの階層には、次のような内容の`.env`ファイルが既に存在しているはずです。

```
TIMES=2
```

`heroku local`を実行すれば、`01`という２つの数字が毎回生成されているのがわかると思います。

Heroku に設定されている設定変数は`config`で確認できます。

```
$ heroku config
=== sharp-rain-871 Config Vars
PAPERTRAIL_API_TOKEN: xxxxxxxxxxxxxxxxx
```

新しく設定変数を適用するには次のようなコマンドを使います。

```
$ heroku config:set TIMES=2
Setting TIMES and restarting ⬢ sharp-rain-871... done, v7
TIMES: 2
```

```
$ heroku config
=== sharp-rain-871 Config Vars
PAPERTRAIL_API_TOKEN: xxxxxxxxxxxxxxxxx
TIMES:                2
```

ではデプロイして、変更したアプリを`heroku open times`を使って開いてみましょう。

## データベースの導入

拡張機能(add-on)の[ストア](https://elements.heroku.com/addons/categories/data-stores)には、Redis や MongoDB から、Postgres や MySql まで、多くのデータベースがあります。今回は、無料のHeroku Postgres Starter Tierを使ってみましょう。

```
$ heroku addons:create heroku-postgresql:hobby-dev
Creating heroku-postgresql:hobby-dev on ⬢ sharp-rain-871... free
Database has been created and is available
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pg:copy
Created postgresql-shallow-xxxxx as DATABASE_URL
Use heroku addons:docs heroku-postgresql to view documentation
```

これによってデータベースが作られ、環境変数に`DATABASE_URL`がセットされます。`heroku config`を使って確認できます。

続いて[pgモジュール](https://npmjs.org/package/pg)を依存関係に入れます。

```
$ npm install pg
+ pg@7.7.1
added 13 packages from 6 contributors and audited 259 packages in 4.827s
found 0 vulnerabilities
```

```package.json
"dependencies": {
  "cool-ascii-faces": "^1.3.4",
  "ejs": "^2.5.6",
  "express": "^4.15.2",
  "pg": "^7.7.1"
},
```

では`index.js`に加筆して、モジュールを使い、環境変数`DATABASE_URL`を利用することでデータベースをつなぎましょう。
上の方に加えます。

```index.js
const { Pool } = require('pg');
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: true
});
```

次にroute、`/db`も加えます。ここでは`test_table`というテーブルから全ての行が返ってくるようになっています。

```index.js
.get('/db', async (req, res) => {
    try {
      const client = await pool.connect()
      const result = await client.query('SELECT * FROM test_table');
      const results = { 'results': (result) ? result.rows : null};
      res.render('pages/db', results );
      client.release();
    } catch (err) {
      console.error(err);
      res.send("Error " + err);
    }
  })
```

これをデプロイして`/db`にアクセスしても、テーブルが存在しないというエラーになります。

<img width="355" alt="test_table doesn't exist.png" src="https://qiita-image-store.s3.amazonaws.com/0/147715/77296ee3-8b3c-5401-5d6b-2f8358752155.png">

Postgresおよび、そのCLIツールは既にローカルにインストールしているとして話を進めます。（していない場合は[こちら](https://devcenter.heroku.com/articles/heroku-postgresql#local-setup)から）
`heroku pg:psql`コマンドを使って、リモートのデータベースにつなぎ、テーブルを作り、行を挿入しましょう。

```
$ heroku pg:psql
--> Connecting to postgresql-shallow-xxxxx
psql (11.0, server 10.6 (Ubuntu 10.6-1.pgdg14.04+1))
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

sharp-rain-871::DATABASE=> create table test_table (id integer, name text);
CREATE TABLE
sharp-rain-871::DATABASE=> insert into test_table values (1, 'hello database');
INSERT 0 1
sharp-rain-871::DATABASE=> \q
```

`/db`にアクセスするとこのような画面になると思います。

<img width="629" alt="database results.png" src="https://qiita-image-store.s3.amazonaws.com/0/147715/6ab6ea90-2726-be8d-e916-76a71ba4c999.png">

詳しく知りたい場合は [Heroku PostgreSQL](https://devcenter.heroku.com/articles/heroku-postgresql)を見ましょう。
同じような方法は[MongoDB や Redis の拡張機能](https://elements.heroku.com/addons/categories/data-stores)のインストールでも使えます。

## 次の段階へ

あなたはアプリをデプロイし、設定を変更し、ログを参照し、スケールし、拡張機能をつけることができるようになりました。

次はこれらを読むのがおすすめです。基礎についてよりちゃんとした理解ができるような記事が一つ、この Dev Center の中で  Node.js について焦点をあてたものが一つ。

- [Heroku の仕組み](https://devcenter.heroku.com/articles/how-heroku-works)
 - コードを書き、設定をいじり、デプロイをし、アプリを動かす上で出てくる概念について総括的に学ぶことができます。
- [Node.js](https://devcenter.heroku.com/categories/nodejs-support)
 - Node.js のアプリについて、またそのデプロイについて学べます。
- [Node.js の Heroku へのデプロイ](https://devcenter.heroku.com/articles/deploying-nodejs)
 - 既存の Node.js アプリを Heroku にデプロイする方法を学べます。