Heroku nodejspath问题…错误:ENOENT:没有这样的文件或目录
我有一个nodejs应用程序使用hapi.js,我试图从一个URL下载图像。 Heroku给我错误的path。
我的代码:
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 +'各种path../ ./ etc',我也尝试过,没有__dirname。
我将使用ffmpeg和一个语音工具创build很多这些文件。 那么有谁能向我解释我有什么样的问题? 这是可以通过使用正确的path名称解决的东西,还是我需要configuration我的hapijs服务器configuration?
你的项目中只有错误的path。
在Heroku上,您不能写入您的项目的根目录下的文件夹。
在你的情况下,你的代码运行在你的项目的“root”文件夹下的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的文件系统是EPHEMERAL ,这意味着你应该把它看作是不存在的。
Heroku这样做的原因是因为他们试图强迫你编写可伸缩的软件。
如果您的应用程序将文件写入您的networking服务器磁盘,则不会太大。 这是因为磁盘空间有限。 每个Web服务器都有自己的磁盘。 这可能会导致混淆/奇怪的行为,其中每个networking服务器都有一个相同的文件副本,等等。这不是一个好习惯。
相反:您应该使用文件存储服务(通常是Amazon S3 )将文件存储在中央位置。
该服务可让您将所有文件存储在中央位置。 意即:
- 您可以轻松地从您的所有Web服务器访问您的文件。
- 您可以拥有由公司pipe理的“可靠”存储。
- 您可以更好地扩展您的Web应用程序。