Heroku NodeJS路径问题...错误:ENOENT:没有这样的文件或目录
我有一个使用hapi.js的NodeJS应用程序,我正在尝试从URL下载图像。Heroku给我提供了路径错误。
我的代码:
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应用程序的目录名称为/app。我试过使用__目录名+‘所有路径.././等’,也试过不使用__目录名。
我将使用ffmpeg和语音工具创建大量这样的文件。有人能给我解释一下我遇到了什么问题吗?是可以通过使用正确的路径名来解决还是需要配置我的hapijs服务器配置?解决方案
您只是在项目中有错误的路径。
在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);
这将按您所需将您的文件正确写入图像文件夹。
但是
这里是事情暂时变得复杂的地方。
在Heroku上,您确实可以将文件写入文件系统,但它们将在短时间后消失。
Heroku的文件系统是短暂的,这意味着您应该将其视为不存在。
Heroku这样做的原因是他们试图强迫您编写可伸缩的软件。
如果您的应用程序将文件写入您的Web服务器磁盘,它的伸缩性不会很大。原因是磁盘空间有限。每个Web服务器都有自己的磁盘。这可能会导致混淆/奇怪的行为,即每个Web服务器都有相同文件的副本,等等。这不是一种好的做法。
相反:您应该使用文件存储服务(通常为Amazon S3)将文件存储在中央位置。
此服务允许您将所有文件存储在中央位置。这意味着:
- 您可以从所有Web服务器轻松访问您的文件。
- 您可以拥有由公司管理的"可靠"存储。
- 您可以更好地扩展Web应用程序。
相关文章