我一直在使用 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/