【问题标题】:Static routing in node expressnode express中的静态路由
【发布时间】:2016-07-23 13:49:39
【问题描述】:

我在 Node Express 中使用了一组静态路由,遇到了一个非常奇怪的现象。

路由设置为'/list/*''/setup/*' 可以访问不同的 html 文件,其中目录用作存储 id,例如更新页面上的信息 url/setup/12345 会将信息存储在 @987654324 @。

为了能够加载脚本等,还有与 /assets/ 匹配的正则表达式的路由,以允许到达 url/setup/assets/script.js 而无需使用新的存储 ID 路由到 setup.html

我的问题是这适用于url/setup/assets/script.js,但不适用于url/list/assets/script.js,即使它们具有相同的路由。


编辑:

导航到url/list/assets/script.js 会导致list.html(不需要的行为)

导航到url/setup/assets/script.js 会导致script.js(需要的行为)


关于为什么 '/list/*'` 不起作用的任何想法?

这是我的静态路由:

app.use(/assets/, express.static(wwwPath));

app.use('/list/*', function(req, res, next) {
    res.sendFile('list.html', { root: wwwPath });
});

app.use('/setup/*', function(req, res, next) {
    res.sendFile('setup.html', { root: wwwPath });
});

【问题讨论】:

  • 如果你不创建多个规则匹配同一路径的冲突规则,你会好很多。现在,'/list/*'/assets 都匹配它不起作用的 URL。可能您最好为/setup/assets 创建一个静态规则,为/list/assets 创建另一个静态规则。然后,一切都会变得清晰明了,没有重叠,没有冲突。
  • /list/* 不会工作”到底是什么意思?
  • @Arbel - 导航到 url/list/assets/script.js 会导致 list.html(不需要的行为) 导航到 url/setup/assets/script.js 会导致 script.js(需要的行为)
  • @jfriend00 是的,可能。但无需详细说明,我需要它来工作。
  • @Presidenten - 好吧,如果您需要帮助,我建议您深入了解细节,因为它无法按照您尝试的方式工作,并且有充分的理由。模棱两可和冲突的路线只是一个非常糟糕的主意,我认为 express.static 不能按您期望的方式工作。您可能需要清理设计以匹配最佳路线的工作方式。如果你想知道为什么在你不想要的时候会得到list.html,那么只需在express.static() 中设置一个断点,然后观察它是如何匹配那个的。

标签: node.js express routing


【解决方案1】:

解决方案是使用自定义中间件。以下是新路线:

var requestParser = function(req, res, next) {
    if(req.originalUrl.indexOf('/assets/') >= 0) {
        var assetPath = path.join(wwwPath,  req.path.slice(req.url.indexOf('/assets/')));
        fs.stat(assetPath, function(error, stat){
            if(stat && stat.isFile()) {
                res.sendFile(assetPath);
            }
            else{ 
                res.status(404).send('<h1>404</h1>');
            }
        });
    }
    else {
        next();
    }
};

app.use(requestParser);

app.use('/list/*', function(req, res, next) {
    res.sendFile('schema.html', { root: wwwPath });
});

app.use('/setup/*', function(req, res, next) {
    res.sendFile('setup.html', { root: wwwPath });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 2014-03-04
    • 2018-01-10
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2018-04-03
    • 2022-01-07
    相关资源
    最近更新 更多