Heroku nodejs路径问题...错误:ENOENT:没有这样的文件或目录

时间:2017-01-25 15:47:19

标签: javascript node.js heroku path relative-path

我有一个使用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服务器配置?

1 个答案:

答案 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)将文件存储在中央位置。

此服务可让您将所有文件存储在中央位置。这意味着:

  • 您可以从所有网络服务器轻松访问文件。
  • 你可以拥有可靠的'由公司管理的存储。
  • 您可以更好地扩展您的网络应用程序。