在 Heroku 上部署 Nodejs 无法提供位于子文件夹中的静态文件
Posted
技术标签:
【中文标题】在 Heroku 上部署 Nodejs 无法提供位于子文件夹中的静态文件【英文标题】:Deploy Nodejs on Heroku fails serving static files located in subfolders 【发布时间】:2013-06-17 05:59:50 【问题描述】:我正在使用 Heroku 部署一个 NodeJs 应用程序。一切正常,除了提供静态文件的小问题。
我有如下配置
app.use(express.static(__dirname + '/htdocs'));
它工作正常,除非我尝试提供位于子文件夹中的静态文件。
www.example.com/bar.js // 这为文件 /htdocs/bar.js 提供服务
www.example.com/foo/bar.js // 这找不到文件 /htdocs/foo/bar.js
我忘了说在我的本地环境中一切正常,可能是 heroku 的问题,但我找不到原因。以前有人遇到过这个问题吗?解决方案?
谢谢!
【问题讨论】:
【参考方案1】:我终于找到了解决方案。
我解决了在我的 package.json 中添加 npm 版本的问题。
"name": "bla",
"version": "0.0.1",
"dependencies":
"express": "3.2.6"
,
"engines":
"node": "0.10.11",
"npm": "1.2.25"
【讨论】:
【参考方案2】:显然,正如在这个问题中解释的那样:Heroku(Cedar) + Node + Express + Jade Client-side javascript files in subdirectory work locally with foreman+curl but not when pushed to Heroku,您不能将 __dirname 与 Heroku 一起使用。
替代方案似乎是:
// 在 web.js 的顶部 process.env.PWD = process.cwd()
// 然后 app.use(express.static(process.env.PWD + '/htdocs'));
【讨论】:
嘿!我已经找到了,但没有工作......但我现在真的找到了灵魂!这只是我的 package.json,我忘了放 npm 版本,我不知道为什么,但这解决了整个问题。谢谢! 我猜这是因为 Heroku 需要它来下载正确版本的 NPM。默认情况下,它应该下载一个非常旧的。我们不知道那时应该发生什么:) 我已经向 package.json 添加了一个 npm 版本,并做了这个解决方案。还是不行。【参考方案3】:如果这些解决方案都不起作用,请查看my solution。
确保您的目录的子目录已添加到您的 Git 存储库中。
【讨论】:
这对我有用。我忽略了 .gitignore 中的 /dist 目录。我删除了它,静态文件链接按预期工作。 我也一样,现在我知道 .gitignores 做了什么:P【参考方案4】:我通过从 .gitignore 文件中删除公用文件夹解决了我的问题。我不知道它在那里做什么。
【讨论】:
【参考方案5】:我为此苦苦挣扎了一段时间,不得不恢复使用 /public(来自 /dist)作为静态文件夹 - 现在完美运行
【讨论】:
【参考方案6】:在我的例子中,我的构建中有一个步骤实际上是清除 /public
文件夹,然后重新添加到 bundle.js 和 bundle.css。
所以在我的本地我没有看到它,但是当它部署到 Heroku 时,资产丢失了。
【讨论】:
以上是关于在 Heroku 上部署 Nodejs 无法提供位于子文件夹中的静态文件的主要内容,如果未能解决你的问题,请参考以下文章
带有 Gmail 服务的 Nodemailer 无法在 heroku 上运行