開発の回し方
直すたびに止めて起動し直す
サーバーは起動したあと待ち続けます。ここに落とし穴があります。コードを直しても、動いているサーバーは古いままです。
直したのに応答が変わらない、と悩む時間のほとんどはこれです。起動し直すまで、新しいコードは反映されません。
--watch で自動的に入れ替える
Node.js には、ファイルの変更を見張って自動で起動し直す仕組みがあります。
プレーンテキスト
node --watch app.jsこれで保存するたびにサーバーが入れ替わります。第1章で npm run dev に登録したのが、まさにこの形でした。
JSON
{
"scripts": {
"start": "node app.js",
"dev": "node --watch app.js"
}
}開発中は npm run dev、本番では npm start を使います。本番で勝手に再起動されると困るので、分けてあります。
ポートが空かないことがある
止めそこねたサーバーが残っていると、次の起動でこうなります。
プレーンテキスト
Error: listen EADDRINUSE: address already in use :::3000そのポートは誰かが使っている、という意味です。犯人はたいてい自分が前に起動したサーバーです。前のものを止めるか、別のポート番号を使えば解決します。
ポート番号を決め打ちにしない
本番のサーバーでは、どのポートを使うかを環境が指定してくることがあります。
JavaScript
const port = process.env.PORT || 3000;
app.listen(port);process.env は、第1章で見た process の中にある環境変数です。指定があればそれを使い、無ければ 3000 を使う、という書き方になります。環境ごとに変わる値をコードに埋め込まないのは、第8章で本番へ持っていくときに効いてきます。
手を動かす
演習では、ポート番号を決める関数を書きます。環境変数を優先し、無ければ既定値に落とす形にしてください。
要件
env.PORTが数値として読めるならその数値を返すPORTが無い・空文字・数値にならない文字列のときは既定値を返す- 返すのは文字列ではなく数値にする
入出力例
resolvePort({"PORT":"8080"}, 3000) → 8080
resolvePort({}, 3000) → 3000
resolvePort({"PORT":""}, 3000) → 3000
resolvePort({"PORT":"abc"}, 3000) → 3000
resolvePort({}, 4000) → 4000ヒント
編集 ゆめさく編集部