53

我的 Node 应用程序在本地运行良好,但在部署到 Heroku 时遇到错误。该应用程序在一个文件夹中使用 Sequelize /models,其中包含index.js,Company.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 提交,然后移回并再次提交以确保Company.js在 git 存储库中大写。这并没有解决问题,我不确定问题可能是什么。

4

7 回答 7

124

问题是由于区分大小写和文件命名。Mac OS X 不区分大小写(但可以识别),而 Heroku 基于 Linux 并且区分大小写。通过heroku run bash从我的终端运行,我能够看到该/models文件夹​​是如何出现在 Heroku 的文件系统上的。解决方案是将本地系统上的User.js和重命名Company.js为新的临时文件,将更改提交到 git,然后重命名User.jsCompany.js注意大写的第一个字母,然后通过 git 再次提交更改。以前我曾尝试直接从user.jstoUser.jscompany.jsto重命名文件,Company.js但 git commit 和区分大小写的文件名更改并未反映在 Heroku 上。

于 2013-10-13T17:22:08.573 回答
34

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

于 2013-10-13T11:07:08.120 回答
5

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

于 2017-12-17T15:24:34.560 回答
2

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

$ heroku config:set NODE_MODULES_CACHE=false

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

于 2020-07-12T22:35:57.573 回答
0

我的一个文件在本地有一个小写名称,并且需要小写。

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

在 git repo 上它是大写的。

'../models/Product'

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

于 2020-10-05T04:38:46.047 回答
0

不确定这是否与此处描述的问题相同,但对我而言,我require("dotenv").config()的问题并不取决于代码运行的环境,因此 Heroku 无法找到它,因为它是作为devDependency.

使固定:

if (process.env.NODE_ENV !== "production") {
  require("dotenv").config();
}
于 2020-10-24T02:32:00.717 回答
0

对我来说,我只是从 Heroku 中删除了旧应用程序并通过 Heroku web 创建了新应用程序,然后将代码推送到新应用程序,然后它就可以工作了。

于 2022-03-01T18:37:55.270 回答