1. ホーム
  2. javascript

[解決済み] Heroku + Node: Cannot find module エラー

2022-02-19 09:16:26

質問

私のNodeアプリはローカルでは問題なく動作していますが、Herokuにデプロイする際にエラーが発生しました。このアプリはSequelizeを /models フォルダがあり、その中には index.js , Company.jsUsers.js . ローカルでは、次のコードを使ってモデルをインポートすることができます。 /models/index.js :

// load models
var models = [
  'Company',
  'User'
];
models.forEach(function(model) {
  module.exports[model] = sequelize.import(__dirname + '/' + model);
});

これは問題なく動作しますが、Herokuにデプロイすると以下のエラーでアプリがクラッシュします。

Error: Cannot find module '/app/models/Company'
   at Function.Module._resolveFilename (module.js:338:15)
   at Function.Module._load (module.js:280:25)
   at Module.require (module.js:364:17)
   at require (module.js:380:17)
   at module.exports.Sequelize.import (/app/node_modules/sequelize/lib/sequelize.js:219:24)
   at module.exports.sequelize (/app/models/index.js:60:43)
   at Array.forEach (native)
   at Object.<anonymous> (/app/models/index.js:59:8)
   at Module._compile (module.js:456:26)
   at Object.Module._extensions..js (module.js:474:10)
Process exited with status 8

当初は大文字小文字の違いによるものだと考えていましたが(ローカルの mac と heroku linux)、ファイルを移動して git commit し、さらに移動して再度 commit することで、確実に Company.js は、git リポジトリでは大文字になります。これは問題を解決しなかったので、何が問題なのかよくわかりません。

解決方法は?

問題は、大文字と小文字の区別とファイル名の命名に起因していました。Mac OS Xは大文字と小文字を区別しませんが、HerokuはLinuxをベースにしているので大文字と小文字を区別します。そこで heroku run bash をターミナルから確認することができました。 /models フォルダが Heroku のファイルシステム上に表示されました。解決策は User.jsCompany.js を新しい一時ファイルにコピーし、変更を git にコミットした後、リネームして User.jsCompany.js 最初の文字が大文字になるように気をつけながら、gitで再度変更をコミットしてください。以前は、ファイル名を直接 user.js から User.jscompany.js から Company.js が、git commit と大文字小文字を区別したファイル名の変更が Heroku に反映されませんでした。