【问题标题】:Express array of routes快速路线阵列
【发布时间】:2020-01-30 08:09:39
【问题描述】:

express documentation 表示您可以为 app.use() 中的路径变量提供一个数组。我试图让路由数组中的所有路由都指向静态变量中的静态文件夹。 这是我所拥有的:

const static = express.static(path.join(__dirname, '../build'));
const routes = ['/','/projects','/project1','/blog']
app.use(routes, static);

如果我为每个路由编写一个单独的 app.use() 函数,这些路由都可以与静态文件夹变量一起正常工作,但是如果我可以像文档中那样在数组中获取路由,那么它会更易于维护.该文档没有显示任何表明我需要映射数组的示例。

【问题讨论】:

    标签: node.js express routing


    【解决方案1】:

    因此,看起来(基于实验,因为这不在文档中),当您传递一个路由数组时,Express 会在数组中找到与当前路径匹配的第一个项目并调用该路径的路由处理程序只要。即使还有其他路线也可以匹配(如您的情况),它也不会再次为这些路线调用路线处理程序。

    所以,因为'/'app.use() 一起使用时匹配所有路由,所以它将始终使用该路由,因此其他路由在使用数组时将永远无法正常工作,但在列为单独路由时会正常工作。您可以通过确保最宽松的路线在最后来解决它。所以,把你的数组改成这样:

    const static = express.static(path.join(__dirname, '../build'));
    const routes = ['/projects','/project1','/blog', '/'];
    app.use(routes, static);
    

    这会将'/' 移动到最后,这样其他人就有机会在查看'/' 之前进行匹配,并且。 '/' 只会在路径不是其他路径之一时使用。


    仅供参考,这是一种奇怪的结构,您将多个 URL 路径前缀都指向同一个 ../build 目录,以便 express.static() 在那里查看。没有理由你需要这样做。由于您的 URL 设计,这似乎是人为创建的问题。这样做会导致/x.js/projects/x.js/blog/x.js 等URL 解析为../build 目录中完全相同的x.js 文件。

    【讨论】:

    • 我正在制作一个从静态文件夹提供的反应应用程序,并带有客户端 URL 的反应路由器。如果刷新页面,服务器不知道如何处理它。这会将所有路由指向静态文件夹,以便 react 路由器处理和修复页面刷新问题。
    • @Shawn - 我完全不知道那条评论是什么意思。我准确而准确地回答了您在问题中提出的问题,甚至通过测试验证了它是否有效。如果您还有其他与您的 React 应用程序相关的问题,那么也许您应该提出一个新问题。
    • 来自您的回答:“我不确定您为什么要这样做”。我解释了我为什么这样做。我没有问任何其他问题。
    • @Shawn - 如果您有一个页面刷新问题,需要为相同的文件指向四个不同的静态目录,那么您的静态反应应用程序中可能会遇到不同的问题,因为这不是必需的.如果您愿意,这可能是另一个问题的主题。