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