我有一个使用hapi.js的nodejs应用程序,我正在尝试从网址下载图像。 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应用程序的__dirname是/ app。我已经尝试使用__dirname +'各种路径../ ./ etc',我也尝试过没有__dirname。
我将使用ffmpeg和语音工具创建大量这些文件。那么有人可以向我解释我遇到了什么样的问题吗?是否可以通过使用正确的路径名来解决这个问题,还是我需要配置的hapijs服务器配置?
答案 0 :(得分:2)
你的项目中只有错误的路径。
在Heroku上,您无法写入项目根目录下的文件夹。
在您的情况下,您的代码正在app.js
中运行,该代码位于' root'你项目的文件夹。
因此,在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&的不可写部分#39; s文件系统。
相反,您想写信给:
Request(uri).pipe(fs.createWriteStream(__dirname+'/public/images/'+filename)).on('close', callback);
这样可以将文件正确地写入图像文件夹中。
这里的事情会让事情变得复杂。
在Heroku上,你确实可以将文件写入文件系统,但它们会在很短的时间后消失。
Heroku的文件系统是 EPHEMERAL ,这意味着您应该像对待它一样对待它。
Heroku这样做的原因是因为他们试图强迫您编写可扩展的软件。
如果您的应用程序将文件写入您的网络服务器磁盘,它将无法进行大规模扩展。原因是磁盘空间有限。每个Web服务器都有自己的磁盘。这可能导致混淆/奇怪的行为,其中每个网络服务器都有相同文件的副本等。这不是一个好习惯。
相反:您应该使用文件存储服务(通常为Amazon S3)将文件存储在中央位置。
此服务可让您将所有文件存储在中央位置。这意味着: