簡體   English   中英

Heroku + Node:找不到模塊錯誤

[英]Heroku + Node: Cannot find module error

我的 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 提交,然后移回並再次提交以確保Company.js在 git 存儲庫中大寫。 這並沒有解決問題,我不確定問題可能是什么。

問題是由於區分大小寫和文件命名。 Mac OS X 不區分大小寫(但知道),而 Heroku 基於 Linux 並且區分大小寫。 通過從我的終端運行heroku run bash ,我能夠看到/models文件夾如何出現在 Heroku 的文件系統上。 解決方案是將本地系統上的User.jsCompany.js重命名為新的臨時文件,將更改提交到 git,然后重命名回User.jsCompany.js ,注意首字母大寫,然后提交更改再次通過git。 以前我曾嘗試將文件直接從user.js重命名為User.js ,將company.js重命名為Company.js但 git commit 和區分大小寫的文件名更改並未反映在 Heroku 上。

我看不到確切的修復方法,但是您可以通過運行heroku run bash登錄到 Heroku 實例,然后運行node以輸入 REPL,並嘗試直接要求路徑來自己解決。

對我來說,這是由我不小心包含在 .gitignore 中的文件夾引起的!

我遇到過這樣的錯誤,原因是我將模塊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

我的一個文件在本地有一個小寫名稱,需要小寫。

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

在 git repo 上,它被大寫。

'../models/Product'

服務器試圖請求一個不存在的文件。 我不得不使用git mv在本地重命名文件,然后重新上傳它以解決問題。

不確定這是否與此處描述的問題相同,但對我而言,我的require("dotenv").config()不是以代碼運行的環境為條件的,因此 Heroku 無法找到它,因為它安裝為一個devDependency

修復:

if (process.env.NODE_ENV !== "production") {
  require("dotenv").config();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM