Heroku nodejs pathing issue... Error: ENOENT: no such file or directory
Heroku nodejs pathing issue... Error: ENOENT: no such file or directory
我有一个使用 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 应用程序的 __dirname 是 /app。我尝试过使用 __dirname+'all sorts of pathing ../ ./ etc' 并且我也尝试过不使用 __dirname.
我将使用 ffmpeg 和语音工具创建大量此类文件。那么谁能向我解释我遇到了什么样的问题?是可以通过使用正确的路径名来解决还是我需要配置我的 hapijs 服务器配置?
你的项目路径错误。
在 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
中是 运行,则意味着通过返回文件夹(例如:..
),您正在尝试写入 non-writable Heroku 文件系统的一部分。
相反,您想写信给:
Request(uri).pipe(fs.createWriteStream(__dirname+'/public/images/'+filename)).on('close', callback);
这会正确地将您的文件写入您想要的图像文件夹。
然而
这里是事情暂时变得复杂的地方。
在 Heroku 上,您确实可以将文件写入文件系统,但它们会在短时间后消失。
Heroku 的文件系统是 EPHEMERAL,这意味着您应该将其视为不存在。
Heroku 这样做的原因是因为他们试图强迫您编写可扩展的软件。
如果您的应用程序将文件写入您的网络服务器磁盘,它不会扩展太多。原因是磁盘 space 是有限的。每个 Web 服务器都有自己的磁盘。这可能会导致混淆/奇怪的行为,其中每个网络服务器都有相同文件的副本等。这不是一个好的做法。
相反:您应该做的是使用文件存储服务(通常 Amazon S3)将您的文件存储在一个中央位置。
此服务可让您将所有文件存储在一个中央位置。这意味着:
- 您可以轻松地从所有网络服务器访问您的文件。
- 您可以拥有由公司管理的 'reliable' 存储空间。
- 您可以更好地扩展 Web 应用程序。
您在 heroku 上托管的文件夹被视为“应用程序”,您可以从收到的错误中看到这一点。我在 5 年后发表评论只是为了让未来的观众知道。如果任何文件夹为空,则在推送整个项目时不会将其推送到 github 或 heroku,因为该文件夹为空。
当我们尝试访问最初为空的文件夹时,我们会收到上述错误,因为首先没有推送该文件夹。因此,如果您想消除错误,请放置任何类型的临时文件(我使用的是 txt 文件)并推送代码。现在错误将不再存在,因为这次文件夹被推送并且可以访问它。
我有一个使用 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 应用程序的 __dirname 是 /app。我尝试过使用 __dirname+'all sorts of pathing ../ ./ etc' 并且我也尝试过不使用 __dirname.
我将使用 ffmpeg 和语音工具创建大量此类文件。那么谁能向我解释我遇到了什么样的问题?是可以通过使用正确的路径名来解决还是我需要配置我的 hapijs 服务器配置?
你的项目路径错误。
在 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
中是 运行,则意味着通过返回文件夹(例如:..
),您正在尝试写入 non-writable Heroku 文件系统的一部分。
相反,您想写信给:
Request(uri).pipe(fs.createWriteStream(__dirname+'/public/images/'+filename)).on('close', callback);
这会正确地将您的文件写入您想要的图像文件夹。
然而
这里是事情暂时变得复杂的地方。
在 Heroku 上,您确实可以将文件写入文件系统,但它们会在短时间后消失。
Heroku 的文件系统是 EPHEMERAL,这意味着您应该将其视为不存在。
Heroku 这样做的原因是因为他们试图强迫您编写可扩展的软件。
如果您的应用程序将文件写入您的网络服务器磁盘,它不会扩展太多。原因是磁盘 space 是有限的。每个 Web 服务器都有自己的磁盘。这可能会导致混淆/奇怪的行为,其中每个网络服务器都有相同文件的副本等。这不是一个好的做法。
相反:您应该做的是使用文件存储服务(通常 Amazon S3)将您的文件存储在一个中央位置。
此服务可让您将所有文件存储在一个中央位置。这意味着:
- 您可以轻松地从所有网络服务器访问您的文件。
- 您可以拥有由公司管理的 'reliable' 存储空间。
- 您可以更好地扩展 Web 应用程序。
您在 heroku 上托管的文件夹被视为“应用程序”,您可以从收到的错误中看到这一点。我在 5 年后发表评论只是为了让未来的观众知道。如果任何文件夹为空,则在推送整个项目时不会将其推送到 github 或 heroku,因为该文件夹为空。
当我们尝试访问最初为空的文件夹时,我们会收到上述错误,因为首先没有推送该文件夹。因此,如果您想消除错误,请放置任何类型的临时文件(我使用的是 txt 文件)并推送代码。现在错误将不再存在,因为这次文件夹被推送并且可以访问它。