Express.Static无法用于子目录

7
Express.static 在根目录下对于任何视图都很好用,但是当我添加一个子目录时它就失效了。
app.use(express.static(path.join(__dirname, 'public')));

工作内容:

//Homepage
router.get('/', isAuthenticated, function (req, res, next) {
    res.render('index.hbs', {user: req.user, message:req.flash('message')});      //add add'l data {title:'Express', addlData:'SomeData', layout:'layout'}
});

无法工作:

//Organization Profile
router.get('/orgprofile/:username', function(req,res,next){
    User.findOne({username:req.params.username}, function(err,docs){
        res.render('orgprofile.hbs',{orgdetails:docs});
    });
});

我猜 __dirname 会被更改为任何从 get 请求所做的目录,但我只想在所有静态请求中使用根目录 (/public)。

__dirname每个请求都不会改变。为了解决这个问题,请指定您希望作为静态请求提供服务的URL以及您希望静态请求来自的目录结构。此外,如果您的问题是与res.render()调用有关,则express.static()与之无关。那些是通过模板布局引擎进行的正常文件操作,而不是通过中间件代码路径进行的。 - jfriend00
3个回答

13

使用方法如下:

app.use('/', express.static(__dirname + '/public'));
app.use('/orgprofile', express.static(__dirname + '/public'));

谢谢!这基本上是在说“用(__dirname + '/public')替换'/orgprofile'”吗? - Tyler
是的,它设置了所有从该句柄发出的请求都从该目录中提供服务。 - Vikram Tiwari
2
因为你必须手动为每个子文件夹创建路由,所以被踩了。 - Dog
2
嘿@WonderDog,答案基于Express的限制。我知道这不是一个好的解决方案。与其对唯一现有的解决方案进行负面评价,不如向Express提出功能请求可能更好。 - Vikram Tiwari

3

问题不是由express.static()表达式引起的,可能是由href值错误引起的。 express.static():

app.use(express.static(__dirname + "/public"));

参考资料:

<link rel="stylesheet" type="text/css" href="/stylesheets/main.css">

这是比被接受的答案更好的方法。尽量不要重复自己。 - Ivan Lopes

0

我曾经遇到过同样的问题。如果我使用像http://localhost:8080/postcreate/personal这样的URL,它会因为__dirname的值错误而失败。在cssjs文件或image源的布局文件中的URL获取了错误的前缀。我通过使用proces.env.PWD来解决这个问题。现在它总是使用项目文件夹,这正是我想要的。项目文件夹是我的root。就像.NET项目一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接