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,导入设置错误

Heroku cedar:响应时间比竹子慢?

git push heroku master:Heroku push 被拒绝,没有检测到 Cedar 支持的应用程序

如何在 Heroku Cedar 堆栈上使用 .htaccess 重定向到 HTTPS