LINE Front-end Framework(LIFF)でアプリケーションを開発したい - 7日目

昨日の作業で、Node.jsとPostgreSQLの連携がローカル環境でできるようになりました。本日はこれをHerokuでできるようにします。

データベース接続情報を環境変数にする

ローカル環境とHeroku環境ではデータベースの接続先情報が異なるため、環境変数に設定します。

.env

MY_LIFF_ID=xxxxxxxxxxxxxxx
PG_USER=xxxxxxx
PG_HOST=localhost
PG_DATABASE=develop
PG_PASSWORD=
PG_PORT=5432

2行目以降の「PG_xxxxx」が今回追加した環境変数です。これにあわせて「reservation.js」も修正します。(一部抜粋)

reservation.js

const client = new Client({
   user: process.env.PG_USER,
   host: process.env.PG_HOST,
   database: process.env.PG_DATABASE,
   password: process.env.PG_PASSWORD,
   port: process.env.PG_PORT,
})

「http://localhost:5000/reservation」にアクセスして、正常に動作することを確認します。

ローカルの「.env」ファイルをHerokuに反映しないようにするため、「.gitignore」ファイルを作成します。

.gitignore

.env

Herokuに反映します。

$ git add .
$ git commit -am "Connect DB"
$ git push heroku master

Herokuの「.env」に接続情報が反映されていないことを確認します。

$ heroku run bash
$ tail .env
MY_LIFF_ID=xxxxxxxxxxxxxxx
PG_USER=xxxxxxx
PG_HOST=localhost
PG_DATABASE=develop
PG_PASSWORD=
PG_PORT=5432

反映されてしまいました。どうやら一度gitの対象となったファイルは、あとから「.gitignore」に追加しても駄目なようです。

$ git rm --cached .env

これで次回から反映されなくなるはずです。

HerokuでPostgreSQLを使えるようにする

Herokuのダッシュボード画面「Resources」から「Find more add-ons」を押します。

スクリーンショット 2020-05-05 15.07.55

「Heroku Postgres」を選択します。

スクリーンショット 2020-05-05 15.13.30

「Hobby Dev」を選択し、「Install Heroku …」を押します。

スクリーンショット 2020-05-05 15.16.06

「App to provision to」は、カーソルを入れると入力候補が表示されるはずですので、選択して「Provision add-on」を押します。

スクリーンショット 2020-05-05 15.20.05

わからない方、Herokuのダッシュボードの上に表示されているアレです。

スクリーンショット 2020-05-05 15.22.52

スクリーンショット 2020-05-05 15.24.45

完了するとHerokuのダッシュボードに「Heroku Postgres」が追加されます。クリックすると「DATA」画面が開かれるので、「Settings」の「View Credentials...」を押します。

スクリーンショット 2020-05-05 15.30.02

表示された接続情報をメモします。

スクリーンショット 2020-05-05 15.34.03

Herokuの環境変数に設定します。
※[app]はHerokuのダッシュボードの上に表示されているアレです。

$ heroku config:set PG_USER=[user] -a [app]
$ heroku config:set PG_HOST=[host] -a [app]
$ heroku config:set PG_DATABASE=[database] -a [app]
$ heroku config:set PG_PASSWORD=[password] -a [app]
$ heroku config:set PG_PORT=[port] -a [app]

Herokuのデータベースに接続します。

$ heroku pg:psql -a andywhodreams-20200421

SQLが実行できるか確認します。

[app]::DATABASE=> select now();
             now              
-------------------------------
2020-05-05 07:44:10.795171+00
(1 row)

Herokuでアプリが実行できるか確認する

上記の手順でデータベースに接続し、ローカル環境で実行したSQLを実行します。

create table m_facility (
facility_id int,
name text,
picture text,
primary key(facility_id));

create table t_reservation (
facility_id int,
reservation_date date,
user_id text);

insert into m_facility(facility_id, name, picture) values (1, '会議室1', '001.jpg');
insert into m_facility(facility_id, name, picture) values (2, '会議室2', '002.jpg');
insert into m_facility(facility_id, name, picture) values (3, '会議室3', '003.jpg');
insert into m_facility(facility_id, name, picture) values (4, 'ホールA', '004.jpg');
insert into m_facility(facility_id, name, picture) values (5, 'ホールB', '005.jpg');

ブラウザからHerokuのアプリケーションに接続し、「予約一覧」画面が表示されることを確認します。

スクリーンショット 2020-05-05 19.52.49

LINE公式アカウントから接続できるか確認します。

画像10

うまく表示されました。
しかし、画面を閉じてもう一度起動すると、エラーとなります。

画像11

デバッグしてみます。

reservation.js

    client.connect(function(err) {
       console.log('conn err');
       console.log(err);
   });

ログには以下のように出力されていました。(一部抜粋)

Error: Client has already been connected. You cannot reuse a client.

どうやら、1回目の処理でconnectして、2回目の処理でもう一度connectしようとするとエラーになるようです。
この辺りは明日改善することにします。

今日はここまで!

この記事が気に入ったらサポートをしてみませんか?