Heroku nodejs pathing issue..错误:ENOENT:没有这样的文件或目录



我有一个使用happy的nodejs应用程序.js我正在尝试从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应用程序__dirname是/app。我尝试使用__dirname+'各种路径.././等",我也在没有__dirname的情况下尝试过。

我将使用 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的文件系统是EPHEMERAL的,这意味着你应该像对待它不存在一样对待它。

Heroku这样做的原因是因为他们试图强迫你编写可扩展的软件。

如果您的应用程序将文件写入您的 Web 服务器磁盘,它不会扩展太多。原因是磁盘空间有限。每个 Web 服务器都有自己的磁盘。这可能会导致混乱/奇怪的行为,其中每个网络服务器都有相同文件的副本等。这不是一个好的做法。

相反:您应该做的是使用文件存储服务(通常是 Amazon S3)将文件存储在一个中心位置。

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

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

您在heroku上托管的文件夹被视为"应用程序",您可以从收到的错误中看到。我在 5 年后对此发表评论只是为了让未来的观众知道。如果任何文件夹为空,则当您推送整个项目时,它不会推送到 github 或 heroku,因为该文件夹为空。

当我们尝试访问最初为空的文件夹时,我们收到上述错误,因为该文件夹首先没有被推送。因此,如果您想摆脱错误,请放置任何类型的临时文件(我使用了 txt 文件)并推送代码。现在错误将不再存在,因为这次文件夹被推送并且它可以访问它。

最新更新