Expressの続きです。前回はheroku config
でHerokuに環境変数し、Expressで読み込んでブラウザに表示しました。今回はブラウザ側のFetch APIからHerokuの環境変数を読み込んでブラウザに表示してみます。それではいきましょう!
【目次】
※参考:前回記事
【Express】heroku configでHerokuに環境変数を設定(.envファイルとHerokuの同期) - クモのようにコツコツと
※参考:Node.js / Expressを習得するためにやったことまとめ
qiita.com
前回のおさらい
heroku config
でHerokuに環境変数を設定して、Expressでブラウザに返す。「heroku-config」を使って.envファイルとHerokuも同期して、ローカル、クラウド両方の環境で表示できた。
ローカル環境(.envファイルの環境変数を読み込んでいる)
クラウド環境(Herokuの環境変数を読み込んでいる)
詳細は前回記事を参照
※参考:【Express】heroku configでHerokuに環境変数を設定(.envファイルとHerokuの同期) - クモのようにコツコツと
前回のコードのポイント
前回のコードで環境変数を読み込んでいる部分(countHitsuji()
関数)
countHitsuji = () => { let result = '' const times = process.env.TIMES || 5 for (i = 0; i < times; i++) { // result += i + ' ' result += '羊が' + i + '匹 ' } return result; }
変数times
のprocess.env
によって環境変数TIMES
の値を読み込んでいる。
ブラウザに値を返す部分
.get('/times', (req, res) => res.send(countHitsuji()))
GET送信で/times
にアクセスするとcountHitsuji()
の結果を返す。
今回はブラウザ側からFetch APIでリクエストを返してExpressの返す環境変数を受け取り、ブラウザに表示したい。
環境変数の値だけをブラウザ返す
前回はfor文で環境変数をテキストにしたが、今回は環境変数の値だけをブラウザに返したい。
環境変数を直に読み込んでいたのはprocess.env
の部分。
const times = process.env.TIMES || 5
これをExpressのres.send()
で直に書いて返してみる。
index.jsのexpress()
メソッドチェーンに下記の処理を追記する。
.get('/env', (req, res) => res.send(process.env.NAME))
/env
のパスに対してprocess.env
で環境変数NAME
の値を返す(今回はTIMES
じゃなくてNAME
にしてみた)。
Herokuをローカル起動する
$ heroku locak web
パスで指定した/env
を開くと
http://localhost:5000/env
NAME
の値だけが表示された!
このパスをFetch APIで叩いてブラウザに表示したい。
HTMLコード
「node-js-getting-started」の「/public」フォルダの中に「envTest.html」と「script.js」を作る。
envTest.htmlのコード
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>環境変数テスト</title> </head> <body> <section> <h1>環境変数テスト</h1> <p>ここに環境変数を表示する</p> <ul class="env"></ul> </section> <script src="js/script.js"></script> </body> </html>
ulタグ. env
の中にliタグで表示する予定。
今はまだ内容が無いよう。
Fetch APIの設定
次にscript.jsにFetch APIの設定をする。
以前作ったFetch APIのCRUD処理の「Read」部分とliタグ追加部分を元にしている。
※参考:【JS】Fetch APIを使ってJSON ServerにCRUDする - クモのようにコツコツと
グローバル変数
冒頭でグローバルな変数を設定する。
const env = document.querySelector('.env'); const url = '/env';
- 変数
env
で.env
タグを取得 - 変数
url
には/env
パスを設定
Read設定
// Read const readFetch = () => { fetch(url).then((response) => { if(!response.ok) { console.log('Read error!'); throw new Error('error'); } console.log('Read ok!'); return response.text(); }).then((data) => { console.log(data); appendList(data); }).catch((error) => { console.log(error); }); }; readFetch();
前回と変わったいる部分
最初のthen()
のreturn
fetch(url).then((response) => { // 中略 return response.text(); })
response.json()
ではなくresponse.text()
を返す。
二番目のthen()
.then((data) => { console.log(data); appendList(data); })
テキスト形式でfor文は不要なので削除。appendList()
の引数にdata
をダイレクトに入れている。
liタグの追加
appendList()
部分。前回はここでli
タグだけでなく修正ボタン、削除ボタンなど複数の要素を設定した。
// Append List const appendList = (thisData) => { const li = document.createElement('li'); li.innerHTML = 'こんにちは、' + thisData + 'さん!'; env.appendChild(li); };
今回はli
タグに「こんにちは、thisData
さん!」というテキストを入れてenv
にappendChild()
メソッドで追加する。thisData
の部分にFetch APIで受信したレスポンス(環境変数)を表示する。
ブラウザ挙動確認
先ほどの内容が無いよう状態がどうなるか。
ローカルのHerokuを「Control + C」で一旦閉じてから再起動
$ heroku locak web
やた!「こんにちは、イイダリョウさん!」と表示された!
クラウド上のHerokuにも表示する
今回作った内容をクラウド上のHerokuにもデプロイして表示したい。
git
コマンドでHerokuにデプロイ
git add .
git commit -m "環境変数テストを追加"
git push heroku HEAD:master
クラウドのHeroku、まずは「/env」を開いてみる。
おお、環境変数NAME
の値「イイダリョウ」が表示された!
※参考:https://aqueous-mountain-80366.herokuapp.com/env
次に「envTest.html」を開いてみる。
やた!「こんにちは、イイダリョウさん!」も表示された!
※参考:環境変数テスト
最後に
ということでHerokuの環境変数をFetch APIでリクエストし、それをExpressが返し、Fetch APIはそのレスポンスを受け取ってブラウザに表示する、という流れを体験できました!
次は、このソースをGitHubにデプロイして、さらにGitHubとHerokuを連携してみます。以前、こちらの記事でやった構造です。
※参考:ローカル→Sourcetree→GitHub→Herokuに同期する方法(黒い画面不要!) - クモのようにコツコツと
Herokuの環境変数はgit
でデプロイするソースとは切り離されて別で管理できるはずなので、GitHubのソースに.env
ファイルを除外してもブラウザでは環境変数の値が表示されるはず。それを検証したく。
それではまた!
※参考:Node.js / Expressを習得するためにやったことまとめ
qiita.com