node.js - 如何创建一个中间件来响应 express 上的所有静态文件请求?
问题描述
这是关于如何提供静态文件的明确建议:
https://expressjs.com/en/starter/static-files.html
app.use(express.static('public'))
实际上,这就是我实现它的方式,并且它有效:
app.use(express.static(path.resolve(__dirname,"../static")));
但问题是我的 URL 上的一些静态文件不是真正的静态文件,因为它们是动态构建的以服务请求。
例如:robots.txt
和sitemap.xml
所以现在,这就是我处理这个问题的方式:
app.get("/robots.txt", robotTxt_handler);
app.use(express.static(path.resolve(__dirname,"../static")));
那些特定的文件路由在 之前app.use(express.static())
,因此它们会被那些特定的处理程序响应。
但我想将该逻辑分离到express.router()
不同的文件中。
就像是:
静态路由器.ts
export const staticRouter = express.router();
// HANDLE STATIC ROUTES THE SAME WAY I DESCRIBED ABOVE
所以在我的主文件上,我会这样做:
索引.ts
app.use("/xxx.xxx", staticRouter);
因此,对我的应用程序上的静态文件路由发出的所有请求都应由我的staticRouter
中间件处理。
但我的问题是,如何将所有可能的静态路由表示到我的app.use("/xxx.xxx", ...)
?
这可能吗?
解决方案
刚刚发现您可以将path
属性作为正则表达式传递。
所以下面的代码应该可以工作,但你需要特别注意静态文件中允许的字符。
app.use(/^(\/[\w-]+)+(\.[\w-]+)+$/i, (req, res, next) => {
return res.send("THIS IS A STATIC FILE ROUTE");
});
此正则表达式允许a-z
、0-9
和成为文件夹-
和_
文件名中的容器。
推荐阅读
- c++ - 子类对象中基类的私有属性在哪里?
- c# - IBM MQ 在客户端应用程序生命周期中处理连接
- ios - 如果它们靠近当前选定的单元格,则 selectItem 不选择单元格
- hyperledger-fabric - 无法对等结构中的链码列表
- .net - 通过 VSSonarExtension2012 将 VS2012 与 Sonarqube 服务器连接时出错
- python - 类型错误:sqlalchemy 属性-> 类 'sqlalchemy.orm.attributes.InstrumentedAttribute'
- api - 当域中的任何人都可以找到和访问域中的任何人都可以查看的更改共享选项时,Google API 报告不会获取活动
- c# - 嵌入在 C# WebBrowser 控件中的谷歌地图显示没有缩放/卫星按钮
- hibernate - JSON 中与父级的关系链接不会链接到上一级,可能是由于两个键
- python-3.x - 导入所有文件时,无法跨 Python 2 和 3 对同一目录中的两个文件进行 doctest