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 并分配 name 值 stylesheets 和 group 值 style.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 路由的 vuejs 路由