Heroku + Node: не удается найти ошибку модуля
My Node приложение работает нормально локально, но при запуске в Heroku возникла ошибка. Приложение использует Sequelize в папке /models
, которая содержит index.js
, Company.js
и Users.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 vs heroku linux), но я переместил файл, совершил git commit, а затем снова вернулся и снова зафиксирован, чтобы гарантировать, что Company.js
заглавны в git. Это не решило проблему, и я не уверен, в чем проблема.
Ответы
Ответ 1
Проблема была связана с чувствительностью к регистру и именем файла. Mac OS X не чувствительна к регистру (но знает), тогда как Heroku основана на Linux и чувствительна к регистру. Запустив heroku run bash
с моего терминала, я смог увидеть, как папка /models
появилась в файловой системе Heroku. Решение состояло в том, чтобы переименовать User.js
и Company.js
в мою локальную систему в новые временные файлы, зафиксировать изменения на git, а затем переименовать обратно в User.js
и Company.js
, помня о заглавной первой букве и затем совершить изменения снова через git. Раньше я пытался переименовать файлы непосредственно с User.js
на User.js
и Company.js
на Company.js
, но изменения имени файла фиксации с фиксацией и зависящими от регистра символов не отражались на Heroku.
Ответ 2
Я не вижу точное исправление, но вы можете понять это, запустив heroku run bash
для входа в экземпляр Heroku, затем запустите node
, чтобы ввести REPL, и попробуйте напрямую обращаться к ним.
Ответ 3
Для меня это было вызвано папкой, которую я случайно включил в .gitignore!