node.js - Heroku Node 应用程序将路由添加到静态文件

标签 node.js express

我一直在使用 heroku 来托管 Node 应用程序。我在公共(public)目录中声明我的 js/css/images。

process.env.PWD = process.cwd();
app.set('views',process.env.PWD + '/views');
app.use(express.static(process.env.PWD + '/public'));

我试过使用 __dirname 代替 process.cwd(),两者的工作原理相同。无论如何,在这个应用程序中,我渲染了两条路线:

app.get('/challenge', function(req, res){
  res.render('challenge');
});

app.get('/dashboard', function(req, res){
  res.render('dashboard');
});

所以在我的 View 目录中,我有 challenge.ejs 和 dashboard.ejs。两个文件都有css和js include,比如

<script type="text/javascript" src="js/libs/bootstrap.min.js"></script>

当我在本地主机上运行我的应用程序时,我的两个路由都正确呈现,并找到这个 js 文件,但是,当我将我的应用程序推送到 heroku 时,只有仪表板应用程序正确呈现这个文件路径。当试图找到这个 js 文件时,challenge 路由会在 url 前面加上“challenge”,因此无法找到 js 文件。

我的意思是,当我访问 myapp.com/dashboard 时,它会加载 myapp.com/js/libs/bootstrap.min.js,

然而,当我转到 myapp.com/challenge 时,它​​会尝试加载 myapp.com/challenge/js/libs/bootstrap.min.js,它不存在。

我很困惑为什么它可以在本地主机上找到,但部署后却不能。任何帮助将不胜感激,因为我已经尝试了所有我能想到的方法,但都无济于事。

编辑: 当我尝试向任何 url 路径添加参数时,我也会遇到此行为

app.get('/challenge/:my_param',  function(req, res){
  res.render('challenge');
});

再次编辑: 我可以通过添加“前置文本”来呈现公共(public)目录来解决这个问题,但我觉得我在作弊......

app.use("/challenge", express.static(process.env.PWD + '/public'))
app.use(express.static(process.env.PWD + '/public'));

最佳答案

这基本上是文件路径是如何通过本地主机与 Heroku 解析的。使用相对于根的路径修复应该很容易。

<script type="text/javascript" src="./js/libs/bootstrap.min.js"></script>

关于node.js - Heroku Node 应用程序将路由添加到静态文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28127806/

相关文章:

javascript - Res.render() 不渲染

node.js - 带有 React 和 Node 的谷歌应用引擎 : Production setup

node.js - npm 强大的形式仅返回最后一个复选框值

javascript - 在express js 4中分离路由器文件时出错

node.js - 我的 SQS 队列没有显示任何来自 aws-sdk 和 Node.js 的消息

node.js - Express 和 Socket.io - 最佳实践

node.js - meteor : Iron-Router error request entity too large

node.js - 从 Mongoose 3.x 升级到 Mongoose 4.x 时如何在模式中使用模式?

python - 如何将视频流从python传输到 Electron ?

javascript - Graphql shield 返回 Not Authorized for allowed mutation