【Heroku】Application error【Node.js】

#module関係のApplication errorの記事です。

勉強用にHerokuに初デプロイした際に発生した事象をまとめました。

![スクリーンショット 2020-10-27 13.40.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/648176/2ae82c8c-b022-f061-6c69-1782e4854212.png)
Application error とだけ書いてある。

###環境

```
ProductName:    Mac OS X
ProductVersion: 10.13.6
BuildVersion:   17G14033
```

```
 yutakaf@mi  ~/Desktop/git/weather_web   main  heroku --version
heroku/7.46.2 darwin-x64 node-v12.16.2
 yutakaf@mi  ~/Desktop/git/weather_web   main  node -v
v12.18.4
```

###素直に```heroku logs --tail```を入力しよう。

```console
 yutakaf@mi  ~/Desktop/git/weather_web   main  heroku logs --tail
2020-10-27T04:13:34.590447+00:00 app[web.1]: at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12) {
2020-10-27T04:13:34.590448+00:00 app[web.1]: code: 'MODULE_NOT_FOUND',
2020-10-27T04:13:34.590448+00:00 app[web.1]: requireStack: [ '/app/src/app.js' ]
2020-10-27T04:13:34.590448+00:00 app[web.1]: }
2020-10-27T04:13:34.601505+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2020-10-27T04:13:34.601726+00:00 app[web.1]: npm ERR! errno 1
2020-10-27T04:13:34.606489+00:00 app[web.1]: npm ERR! weather_web@1.0.0 start: `node src/app.js`
2020-10-27T04:13:34.606605+00:00 app[web.1]: npm ERR! Exit status 1
2020-10-27T04:13:34.606716+00:00 app[web.1]: npm ERR!
2020-10-27T04:13:34.606828+00:00 app[web.1]: npm ERR! Failed at the weather_web@1.0.0 start script.
2020-10-27T04:13:34.606911+00:00 app[web.1]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
2020-10-27T04:13:34.611862+00:00 app[web.1]:
2020-10-27T04:13:34.612012+00:00 app[web.1]: npm ERR! A complete log of this run can be found in:
2020-10-27T04:13:34.612101+00:00 app[web.1]: npm ERR!     /app/.npm/_logs/2020-10-27T04_13_34_607Z-debug.log
2020-10-27T04:13:34.661115+00:00 heroku[web.1]: Process exited with status 1
```
code: 'MODULE_NOT_FOUND'でmoduleが見つかっていないと言われている。
package.jsonでmoduleのインストール設定がdevDependenciesになっているので当たり前だぞ。

起動確認でもcrashedと言われている。

```console
 ✘ yutakaf@mi  ~/Desktop/git  heroku ps --app rac-weather-application
Free dyno hours quota remaining this month: 550h 0m (100%)
Free dyno usage for this app: 0h 0m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Free): npm start (1)
web.1: crashed 2020/10/27 13:17:14 +0900 (~ 5m ago)
```

####変更前

```package.json
{
  "name": "weather_web",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node src/app.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "dotenv": "^8.2.0",
    "express": "^4.17.1",
    "hbs": "^4.1.1",
    "nodemon": "^2.0.6",
    "request": "^2.88.2"
  }
}
```

####変更後

```package.json
{
  "name": "weather_web",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "node src/app.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "nodemon": "^2.0.6"
  },
  "dependencies": {
    "dotenv": "^8.2.0",
    "express": "^4.17.1",
    "hbs": "^4.1.1",
    "request": "^2.88.2"
  }
}
```
※1 ちなみにrequest moduleは現在非推奨だぞ。
※2 そもそも、どのモジュールをちゃんと使うか考えていなかったので、```npm install --save--dev <package>```していたのが原因。

###アクセスキーを環境変数から取得している。
githubでpublic設定にしてみたかったので、アクセスキーは公開できない。
なのでコード上では、環境変数から取得する形式をとっていた。
こちらのエラーはモジュール問題を解決する前に解消してしまったため（たぶん）ログにて出力されていないが、おそらく、うまくいっていない場合には、エラーがでたと思われる。
下記のように設定した。

```
 ✘ yutakaf@mi  ~/Desktop/git/weather_web   main  heroku config:set --app rac-weather-application WEATHER_ACCESS_KEY='WEATHER_ACCESSのアクセスキー'
Setting WEATHER_ACCESS_KEY and restarting ⬢ rac-weather-application... done, v4
WEATHER_ACCESS_KEY: WEATHER_ACCESSのアクセスキー
 yutakaf@mi  ~/Desktop/git/weather_web   main  heroku config:set --app rac-weather-application MAPBOX_ACCESS_KEY='MAPBOX_ACCESSのアクセスキー'
Setting MAPBOX_ACCESS_KEY and restarting ⬢ rac-weather-application... done, v5
MAPBOX_ACCESS_KEY: MAPBOX_ACCESSのアクセスキー
```

###起動ログ

```
2020-10-27T05:01:17.934935+00:00 heroku[web.1]: Idling
2020-10-27T05:01:17.937105+00:00 heroku[web.1]: State changed from up to down
2020-10-27T05:01:19.323569+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2020-10-27T05:01:19.460035+00:00 heroku[web.1]: Process exited with status 143
2020-10-27T05:12:04.440395+00:00 heroku[web.1]: Unidling
2020-10-27T05:12:04.442228+00:00 heroku[web.1]: State changed from down to starting
2020-10-27T05:12:07.737901+00:00 heroku[web.1]: Starting process with command `npm start`
2020-10-27T05:12:10.699194+00:00 app[web.1]:
2020-10-27T05:12:10.699212+00:00 app[web.1]: > weather_web@1.0.0 start /app
2020-10-27T05:12:10.699213+00:00 app[web.1]: > node src/app.js
2020-10-27T05:12:10.699213+00:00 app[web.1]:
2020-10-27T05:12:11.246046+00:00 app[web.1]: Server is up on port 23085.
2020-10-27T05:12:11.944720+00:00 heroku[web.1]: State changed from starting to up
2020-10-27T05:12:13.551783+00:00 heroku[router]: at=info method=GET path="/" host=rac-weather-application.herokuapp.com request_id=d778277e-47cc-4e1d-b7e1-94210990b33b fwd="153.229.157.158" dyno=web.1 connect=0ms service=60ms status=200 bytes=982 protocol=https
2020-10-27T05:12:13.911402+00:00 heroku[router]: at=info method=GET path="/css/styles.css" host=rac-weather-application.herokuapp.com request_id=ce338878-68d3-4356-a04a-d7a3375425da fwd="153.229.157.158" dyno=web.1 connect=0ms service=32ms status=200 bytes=1135 protocol=https
2020-10-27T05:12:14.130888+00:00 heroku[router]: at=info method=GET path="/js/app.js" host=rac-weather-application.herokuapp.com request_id=db28448f-e70f-4059-b1d1-4cc9572a17d0 fwd="153.229.157.158" dyno=web.1 connect=0ms service=4ms status=200 bytes=951 protocol=https
2020-10-27T05:12:14.366065+00:00 heroku[router]: at=info method=GET path="/favicon.ico" host=rac-weather-application.herokuapp.com request_id=38ea6d92-4f3f-4cef-bcec-dea094db7ede fwd="153.229.157.158" dyno=web.1 connect=0ms service=15ms status=200 bytes=815 protocol=https
2020-10-27T05:12:21.452041+00:00 heroku[router]: at=info method=GET path="/weather?address=Tokyo" host=rac-weather-application.herokuapp.com request_id=f83c9643-bc93-4f29-8857-b5aa32e691f1 fwd="153.229.157.158" dyno=web.1 connect=3ms service=600ms status=200 bytes=466 protocol=https

```

### とりあえず、テストデプロイまで完了

[WeatherApplication](https://rac-weather-application.herokuapp.com/)　※起動まで時間かかる。
[github](https://github.com/blackraccoon000/weather_web)　※コードはこっち。

WeatherApplication内にgithubのリンク貼るとか、いろいろと思うことはありますが、環境付きでのエラー記事は貴重かと思ったので記事化しました。

### References

[【Node】dotenvで環境変数を設定する](https://qiita.com/ozaki25/items/3e2cf94f29bd0edc1979)
[package.jsonにおけるdependenciesとdevDependenciesの違い(超シンプルに)](https://qiita.com/fj_yohei/items/0b7fc2bc826df23935db)
[Node.jsでのHerokuチュートリアル前編](https://qiita.com/shti_f/items/b4b5d830672d908eff4e)
[[heroku] 環境変数の操作](https://qiita.com/colorrabbit/items/18db3c97734f32ebdfde)
[WEATHERのAPI(位置情報→天気取得)](https://weatherstack.com/)
[MAPBOXのAPI(住所→位置情報取得)](https://www.mapbox.com/)