Heroku(Cedar) + Node + Express + Jade 子目录中的客户端 javascript 文件在本地与 foreman+curl 一起工作,但在推送到 Heroku 时不能
Posted
技术标签:
【中文标题】Heroku(Cedar) + Node + Express + Jade 子目录中的客户端 javascript 文件在本地与 foreman+curl 一起工作,但在推送到 Heroku 时不能【英文标题】:Heroku(Cedar) + Node + Express + Jade Client-side javascript files in subdirectory work locally with foreman+curl but not when pushed to Heroku 【发布时间】:2012-05-09 04:52:48 【问题描述】:我对 node 和 heroku 很陌生,我怀疑这是某种简单的权限问题等,但我似乎无法找到它。
我的 web.js 文件所在的根目录下一层的子目录中有几个纯 javascript 文件。我的 web.js 文件中有一行用于指定目录
app.use('/heatcanvas',express.static(__dirname+'/heatcanvas'));
如果我使用 Heroku Foreman 在本地运行我的应用程序,我会在运行以下 curl 命令时得到预期的 js 响应
curl localhost:5000/heatcanvas/heatcanvas.js
但是,当我推送到 Heroku 并在浏览器中点击相应的实时网址时
www.example.com/heatcanvas/heatcanvas.js
我收到以下信息:
Cannot GET /heatcanvas/heatcanvas.js
如果我检查 Firebug 和/或 Heroku 日志,我发现这些文件实际上出现 404 错误,即使路径应该与本地正在执行的操作相匹配。还值得一提的是,第三方 javascript 过来就好了,只有当 script 标签的 src 属性指向我的站点时,才会出现问题。我需要做什么才能让我的脚本可用?
【问题讨论】:
我从未研究过细节,但我知道在 Rails on Heroku 中,您将静态资产放入/编译到 root/public 中。例如 Rails 将/assets/base.sass
编译为/public/stylesheets/base.css
。所以我认为 Heroku 将 public
目录公开为静态可访问目录。您通常无法访问生产服务器上的任意文件,就像您在传统 php 应用程序中所习惯的那样。您必须指定一个实际提供该 heatcanvas.js 文件的 GET 路由——但您不想这样做。我真的很生疏,但也许可以尝试使用public
目录。
在Cedar stack 请求被路由到不受干扰的测功机。因此,由应用程序/框架来提供静态资产。 public
目录的唯一特别之处是 Rails 应用程序/框架从那里提供资产。 Node.js 应用程序将具有不同的结构。
您能否在其中一项请求中包含heroku logs -t
的输出?
你的 app.use()
是否在一个不在 Heroku 上运行的 app.configure()
块中?您必须专门运行 $ heroku config:add NODE_ENV=*
以便 Express 知道要使用什么环境。
【参考方案1】:
我建议你使用 process.cwd() 值来获取特定目录
process.env.PWD = process.cwd()
在您的 web.js
开头让您轻松访问文件。
你可以的
app.use('/heatcanvas',express.static(process.env.PWD+'/heatcanvas'));
而不是使用
__dirname
警告:确保在web.js的根目录下执行web.js(Heroku web.js就是这样执行的)
【讨论】:
谢谢,这对我帮助很大!不确定 OP 是否具有相同的设置,但我正在使用几个 dynos 运行 Heroku,结果你不能像我在本地那样使用app.use(... __dirname+'/path');
。您必须改用process.env.PWD
。
看来,这对我不起作用! Heroku 总是预先附加一个名为“app”的文件夹,因此它认为我的 server.js(在根目录中)位于一个名为“app”的文件夹中。本地测试没问题。
iam 处于相同状态 Pille 您如何在此范围内更正此应用程序默认文件夹事件(本地对我来说也总是可以的)以上是关于Heroku(Cedar) + Node + Express + Jade 子目录中的客户端 javascript 文件在本地与 foreman+curl 一起工作,但在推送到 Heroku 时不能的主要内容,如果未能解决你的问题,请参考以下文章
从 Heroku Bamboo 堆栈升级到 Cedar 堆栈
如何将heroku cedar-14堆栈应用程序升级到最新的heroku堆栈(即,升级到heroku 18)
Heroku 上的 Django 部署,升级到 Cedar-14,导入设置错误