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应用程序。

相关文章