ExpressJS:如何忽略路由中的公共静态文件?

Posted

技术标签:

【中文标题】ExpressJS:如何忽略路由中的公共静态文件?【英文标题】:ExpressJS: How do I ignore public static files in my route? 【发布时间】:2011-10-06 21:03:46 【问题描述】:
app.get("/:name?/:group?", function(req, res)...

正在匹配我的公共目录中的文件。所以如果我包含一个样式表:

<link type="text/css" href="/stylesheets/style.css" />

Node 将匹配 /stylesheets/style.css 并分配 namestylesheetsgroupstyle.css。

避免这种情况的最佳方法是什么?

【问题讨论】:

【参考方案1】:

最简单的事情可能是确保 express 在路由器中间件之前运行静态提供程序中间件。你可以这样做:

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

这样静态文件会找到它并做出响应,并且不会执行路由器。我对路由器的默认位置(最后一个)搞砸了我对咖啡脚本文件的编译有类似的困惑。仅供参考,此here 上有文档(在页面上搜索app.router,您会看到一个解释性段落。

【讨论】:

这正是我想要的!谢谢 我认为自发布此答案以来,Express API 发生了变化。适合我的语法是: app.use('/public', express.static(__dirname + '/public'));我也不需要 app.router 行。 @ashack 这一切都取决于您是否希望在 URL、文件系统或两者中都使用 /public。通常public 是文件系统目录的名称,但不会作为 URL 的一部分出现。您是否需要关于app.router 的明确行还取决于您对app.get 和朋友的其他呼叫是如何排序/组织的。 在我有一个app.get("/*", function(req, res) ) 来捕获“直接”url 请求和页面重新加载等的情况下,这对我有用,但我不希望它处理 css 的后续页面请求、js、img 文件。我把app.use(express.static("public")); 放在它上面,catchall 不再处理这些请求。 @PeterLyons 实际上并非在所有情况下都有效 - ***.com/questions/58375400/…【参考方案2】:

对于任何可能需要它的人,我的解决方案是使用中间件。如果有人找到更好的解决方案,请告诉我!

public = ['images', 'javascripts', 'stylesheets', 'favicon.ico']

ignore = (req, res, next) ->
    if public.indexOf(req.params.name) != -1
        console.log "Ignoring static file: #req.params.name/#req.params.group"
        next('route')
    else
        next()

app.get "/:name?/:group?", ignore, (req, res) -> ...

【讨论】:

next('route')和next有什么区别?【参考方案3】:

您还可以使用像 nginx 这样的反向代理来为您处理静态文件。我相信许多专业的 Node / Ruby on Rails 设置都是这样做的。

【讨论】:

在生产中是的,这是要走的路。通常,您仍然希望将其设置为 express 以及用于本地开发目的。通常人们在本地开发过程中不会使用反向代理,但您仍然需要一些东西来为您的静态文件提供服务。

以上是关于ExpressJS:如何忽略路由中的公共静态文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 expressJS 提供 ReactJS 静态文件?

ExpressJS教程

如何使用带有历史回退和 expressjs 路由的 vuejs 路由

异步和递归目录扫描,用于 Nodejs 和 Expressjs 中的文件列表

Laravel:如何路由到公共文件

如何在 ExpressJS 和 multer 中将数据从一个路由器传递到另一个路由器?