2013-10-13 150 views
32

我的Node應用程序在本地運行正常,但在部署到Heroku時出現錯誤。該應用在/models文件夾中使用Sequelize,其中包含index.js,Company.jsUsers.js。在當地,我可以使用下面的代碼導入模型/models/index.jsHeroku + Node:找不到模塊錯誤

// 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存儲庫中大寫。這並沒有解決問題,我不知道問題可能是什麼。

回答

60

問題是由於區分大小寫和文件命名。 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 commit和區分大小寫的文件名更改並未反映在Heroku上。

+0

很高興幫助,好工作! – dankohn

+3

該死的好偵探工作。 – WildService

+1

我有這個相同的問題,並試圖找出最長的時間。謝謝你,而不是@dankohn! –

20

我看不到確切的修復方法,但您可以通過運行heroku run bash登錄到Heroku實例,然後運行node來輸入REPL,並嘗試直接請求路徑,從而自己弄清楚。

+0

感謝這個有助於我解決問題的有用的調試技巧。 – surfearth

+1

謝謝,省了很多時間:) – tom

0

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