Heroku + Node:找不到模块错误

时间:2013-10-13 04:49:29

标签: javascript git node.js heroku sequelize.js

My Node应用程序在本地运行正常,但在部署到Heroku时遇到错误。该应用在/models文件夹中使用Sequelize,其中包含index.jsCompany.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提交,然后又移回并再次提交以确保{g}在git中大写库。这并没有解决问题,我不确定问题是什么。

6 个答案:

答案 0 :(得分:74)

问题是由于区分大小写和文件名称。 Mac OS X不区分大小写(但知道),而Heroku基于Linux并且区分大小写。通过从终端运行heroku run bash,我能够看到Heroku的文件系统上/models文件夹的显示方式。解决方案是将本地系统上的User.jsCompany.js重命名为新的临时文件,将更改提交给git,然后重命名为User.jsCompany.js注意到首字母大写,然后通过git再次提交更改。以前我曾尝试将文件直接从user.js重命名为User.jscompany.jsCompany.js,但git提交和区分大小写的文件名更改并未反映在Heroku上。

答案 1 :(得分:23)

我看不到确切的修复方法,但是您可以通过运行heroku run bash来登录Heroku实例,然后运行node输入REPL,并尝试要求路径来自行解决直接

答案 2 :(得分:0)

对我来说,这是由我不小心包含在.gitignore中的文件夹引起的!

答案 3 :(得分:0)

我遇到了类似这样的错误,原因是我将模块module.js重命名为Module.js,并且Heroku缓存与名称冲突。您必须禁用模块缓存以避免这种错误:

$ heroku config:set NODE_MODULES_CACHE=false

来源:https://help.heroku.com/TO64O3OG/cannot-find-module-in-node-js-at-runtime

答案 4 :(得分:0)

我的一个文件在本地具有小写名称,并且必须使用小写。

const Product = require('../models/product');

在git仓库中,它被大写了。

'../models/Product'

服务器试图请求一个不存在的文件。我不得不使用git mv在本地重命名该文件,然后重新上传以解决该问题。

答案 5 :(得分:0)

不确定这是否与此处描述的问题相同,但是对我而言,我的require("dotenv").config()不受运行代码的环境的限制,因此Heroku找不到它,因为它是以{的形式安装的{1}}。

修复:

devDependency