Подтвердить что ты не робот

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. Это не решило проблему, и я не уверен, в чем проблема.

4b9b3361

Ответ 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!