web-dev-qa-db-fra.com

Heroku + Node: erreur de module introuvable

L'application My Node fonctionne correctement localement, mais une erreur s'est produite lors du déploiement sur Heroku. L'application utilise Sequelize dans un dossier /models, qui contient index.js, Company.js et Users.js. Localement, je peux importer les modèles en utilisant le code suivant dans /models/index.js:

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

Cela fonctionne bien, cependant, lorsque je déploie sur Heroku, l'application se bloque avec l'erreur suivante:

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

Initialement, je pensais que c'était dû à la sensibilité à la casse (mac local contre heroku linux), mais j'ai déplacé le fichier, créé un commit git, puis déplacé en arrière et commis à nouveau pour s'assurer que Company.js est capitalisé dans le référentiel git. Cela n'a pas résolu le problème et je ne suis pas sûr de la nature du problème.

35
surfearth

Le problème était dû à la sensibilité à la casse et au nom de fichier. Mac OS X est sensible à la casse (mais conscient) alors que Heroku est basé sur Linux et est sensible à la casse. En exécutant heroku run bash à partir de mon terminal, j'ai pu voir comment le dossier /models apparaissait sur le système de fichiers de Heroku. La solution consistait à renommer User.js et Company.js sur mon système local en nouveaux fichiers temporaires, à valider les modifications apportées à git, puis à renommer à nouveau User.js et Company.js en tenant compte de la première lettre en majuscule, puis en validant à nouveau les modifications via git. Auparavant, j'avais essayé de renommer les fichiers directement de user.js à User.js et de company.js à Company.js, mais les modifications de git commit et de noms de fichiers sensibles à la casse ne concernaient pas Heroku.

71
surfearth

Je ne vois pas le correctif exact, mais vous pouvez le découvrir vous-même en exécutant heroku run bash pour vous connecter à une instance Heroku, puis exécutez node pour entrer un REPL et essayez d'exiger les chemins directement.

22
dankohn

Pour moi, cela était dû à un dossier que j'avais accidentellement inclus dans .gitignore! 

0
Adrien Joly