2017-01-25 100 views
1

我有一個nodejs應用程序使用hapi.js,我試圖從一個url下載圖像。 Heroku給我錯誤的路徑。Heroku nodejs路徑問題...錯誤:ENOENT:沒有這樣的文件或目錄

我的代碼:

Request(uri).pipe(fs.createWriteStream(__dirname+'/../public/images/'+filename)).on('close', callback); 

我的錯誤:

Error: ENOENT: no such file or directory, open '/app/../public/images/1430540759757341747_4232065786.jpg' 

我的文件結構很簡單:

app.js 
-public 
-images 
    -sampleimage.jpg 
-videos 
    -samplevideo.mp4 
-audio 
    -sampleaudio.wav 

正如你所看到的Heroku應用__dirname是/應用程序。我嘗試過使用__dirname +'各種路徑../ ./ etc',我也嘗試過不使用__dirname。

我將使用ffmpeg和一個語音工具創建大量這些文件。那麼有誰能向我解釋我有什麼樣的問題?這是可以通過使用正確的路徑名稱解決的問題,還是我需要配置的我的hapijs服務器配置?

回答

1

你只是在你的項目中有錯誤的路徑。

在Heroku上,您不能寫入您的項目根目錄下的文件夾。

就你而言,你的代碼在app.js中運行,它位於項目的「根」文件夾中。

所以,在Heroku上的文件系統,這意味着你的項目是這樣的:

/app 
/app/app.js 
/app/public 
/app/public/images 
... 

的Heroku把所有的代碼放到一個名爲app文件夾。

現在,在你的代碼粘貼到上面,告訴你:

Request(uri).pipe(fs.createWriteStream(__dirname+'/../public/images/'+filename)).on('close', callback); 

如果此代碼在您的app.js運行,這意味着通過返回一個文件夾(如:..),你想寫入Heroku文件系統的非可寫部分。

相反,你要寫到:

Request(uri).pipe(fs.createWriteStream(__dirname+'/public/images/'+filename)).on('close', callback); 

這將正確撰寫你的文件放到images文件夾像你想要的。

但是

這裏是事情會變得複雜一會兒的地方。

在Heroku上,確實可以將文件寫入文件系統,但是它們會在短時間後丟失文件。

Heroku的文件系統是EPHEMERAL,這意味着你應該對待它,因爲它不存在。

Heroku這樣做的原因是因爲他們試圖迫使你編寫可伸縮軟件。

如果您的應用程序將文件寫入您的網絡服務器磁盤,它不會很大。這是因爲磁盤空間有限。每個Web服務器都有自己的磁盤。這可能會導致混淆/奇怪的行爲,其中每個網絡服務器都有相同文件的副本等。這不是一個好習慣。

相反:你應該做的是使用文件存儲服務(通常Amazon S3)將文件存儲在一箇中心位置。

此服務允許您所有文件存儲在一箇中心位置。這意味着:

  • 您可以輕鬆地從您的所有Web服務器訪問您的文件。
  • 您可以擁有由公司管理的'可靠'存儲。
  • 您可以更好地擴展您的Web應用程序。
+0

嗨,使用S3非常好的建議。這是一個原型,所以現在不應該過分關注存儲。現在我正在寫它,因爲我使用FFMPEG創建與圖像/音頻 我試圖代碼的幻燈片,並將它給了我同樣的錯誤。 錯誤:ENOENT:沒有這樣的文件或目錄,打開'/app/public/images/1435595969584256195_4232065786.jpg' 我很傻,認爲我需要去根下面,因爲heroku已經改變了文件結構。那麼我現在有什麼問題?該文件夾不存在? – Jason

相關問題