Javascript 在Express.js中,如何将通配符路由设置为与资产文件不匹配?

Javascript 在Express.js中,如何将通配符路由设置为与资产文件不匹配?,javascript,node.js,express,url-routing,Javascript,Node.js,Express,Url Routing,我正在构建我的第一个real Express.js应用程序,但仍停留在路由上 我正在启用静态托管: app.use("/", express.static("public")); 然后我有一个通配符路由: router.get("/:page", function(req, res) { // do stuff }); 此路由与URL相匹配,如“/about”和“/contact”——我需要这些URL。但它似乎也在尝试匹配“/style.css”和其他静态资产文件,这是不必要的 如何

我正在构建我的第一个real Express.js应用程序,但仍停留在路由上

我正在启用静态托管:

app.use("/", express.static("public"));
然后我有一个通配符路由:

router.get("/:page", function(req, res) {
    // do stuff
});
此路由与URL相匹配,如“
/about
”和“
/contact
”——我需要这些URL。但它似乎也在尝试匹配“
/style.css
”和其他静态资产文件,这是不必要的


如何使此通配符与资产文件不匹配?

我找到的一个解决方案是在查询中搜索“.”,然后在找到时设置一个标志:

router.get("/:page", function(req, res) {
    if (req.render_view) res.render("index");
});

router.param("page", function(req, res, next, page) {

    // if request is not an asset file      
    if (page.indexOf(".") == -1) {

        // do stuff

        // set a flag
        req.render_view = true;

    }

    next(); 

});

但我想找到一个更干净的解决方案,可能是在路由器中使用正则表达式。获取?

如果我了解您想要做什么,您应该执行以下操作:

app.js

 app.use(express.static(__dirname + '/public'));
 app.use(express.static(__dirname + '/static'));
 app.use('/:page',function(){}..)

当您的公用和静态文件夹与app.js相对时,此配置有效,当浏览器请求静态文件时,第一个服务器将查看公用文件夹,如果文件不存在,则将继续查看静态文件夹,最后转到/:page

这些在express初始化中定义的顺序是什么?区分的简单方法是将
/lib
/static
或类似的东西放在所有静态资产路径的前面(以及在
应用程序中。对于静态文件使用()
),这样就不会混淆静态资产和动态资产。我按照上面列出的顺序执行这些步骤。我在app.use中添加了“/static/”前缀,但这并没有解决问题,我仍然看到style.css和favicon.ico请求由route.get处理。我在想,也许我需要一个正则表达式,如果URL包含句点,那么router.get应该忽略它?如果你这样做
app.use('/static',express.static('public'))
然后将HTML文件中的所有静态文件路径更改为类似于
/static/styles.css
,您应该可以。根据,
/static/styles.css
将不匹配
/:page
,因此上述内容应该可以使用。谢谢!该解决方案无法满足我的需要(我需要资产文件夹位于根级别),但我很欣赏头脑风暴!