web-dev-qa-db-ja.com

Heroku + Node:モジュールエラーが見つかりません

My Nodeアプリはローカルで正常に実行されていますが、Herokuへのデプロイ時にエラーが発生しました。アプリは/modelsindex.jsおよびCompany.jsを含むUsers.jsフォルダーでSequelizeを使用します。 /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コミットを行った後、GitリポジトリでCompany.jsが大文字になっていることを確認するために再度移動してコミットしました。これは問題を解決しませんでした、そして、私は問題が何であるかもしれないかわかりません。

37
surfearth

この問題は、大文字と小文字の区別とファイル名が原因でした。 Mac OS Xは大文字と小文字を区別しません(ただし、認識します)が、HerokuはLinuxベースで大文字と小文字を区別します。端末からheroku run bashを実行すると、Herokuのファイルシステムに/modelsフォルダーがどのように表示されるかを確認できました。解決策は、ローカルシステム上のUser.jsCompany.jsの名前を新しい一時ファイルに変更し、変更をgitにコミットしてから、User.jsCompany.jsに名前を変更することでした。最初の文字を大文字にしてから、git経由で変更を再度コミットします。以前は、ファイル名をuser.jsからUser.jsおよびcompany.jsからCompany.jsに直接変更しようとしましたが、gitコミットおよび大文字と小文字を区別するファイル名の変更はHerokuに反映されませんでした。

78
surfearth

正確な修正はわかりませんが、heroku run bashはHerokuインスタンスにログインし、nodeを実行してREPLを入力し、パスを直接要求します。

23
Dan Kohn

私にとっては、誤って.gitignoreに含まれていたフォルダーが原因でした。

0
Adrien Joly