Node.js / Express.js. 当通配符路由与静态路由一起使用时,静态路由无法被识别。

5
当我只使用这个路由时,其他所有路由的静态文件都能够被正确地提供。
var public_dir = path.join(__dirname, 'public');
app.use('/public', express.static(public_dir));

但是当我添加以下这些代码——所有请求都会被该路由器(而不是之前的路由器)捕获:
app.get('/*', function(req, res){
    res.redirect('/#!' + req.path);
});

对我来说很奇怪,因为 /public 的定义是最先的。但所有请求都会被最后一个定义的 /* 请求处理程序处理。
现在,如果我尝试打开页面 http://127.0.0.1:3000/public/website/application.js,我会被重定向到 http://127.0.0.1:3000/#!/public/website/application.js。为什么会发生这种情况,如何以最好的方式解决这个问题?
非常感谢!
解决方案很简单。我在中间件列表中有一条无效语句。
app.use(app.router);

这会造成网址路由问题。但奇怪的是,node.js没有告诉我中间件的“设置不正确”。

1
你是在第一个中使用了 app.use,而在第二个中使用了 app.get 吗? - DrCord
1
正如@DrCord所提到的,app.[get|post|put|etc]方法被添加到路由器中。因此,如果您首先挂载路由器,它将首先被使用。 - Nick Mitchinson
就像Nick提到的,路由器和静态位置决定了优先级。请展示一下你如何使用路由器和静态(相对位置)。 - user568109
@NickMitchinson 和 @DrCord。在 app.get('/*', ...) 语句之前,我使用了 app.use('/public', ...)。如果我删除 app.get() 语句,那么我就可以看到我的静态文件。 - Anton Danilchenko
1个回答

4

您的代码没有问题,但请记住,对不存在的内容进行任何请求都将被get('/*', ...)捕获。

这意味着,如果您在/public上加载了public_dir,那么如果public_dir定义为public/website/,则必须执行http://127.0.0.1:3000/public/application.js才能访问位于/public/website/application.js的文件。


是的,在公共文件夹中的文件路径中不应该包含public关键字... - DrCord
我已经更新了下面的代码。我使用 /public 导航到 public directory ,其中包含一些子目录(包括 website)。只有删除了 app.get('/*', ...) 定义时,在浏览器中才能看到我的静态文件。 - Anton Danilchenko
很奇怪,一定是有其他东西在交互。我已经在 https://github.com/BaNzounet/so-express 重新创建了你所描述的内容,并且它可以正常工作。 - BaNz
@BaNz 哎呀!它终于可以工作了!!!问题出在中间件 app.use(app.router); 的定义上有误。 - Anton Danilchenko

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