[node.js]如何创建一个中间件来响应 express 上的所有静态文件请求?

· 收录于 2024-01-06 16:08:08 · source URL

问题详情

这是关于如何提供静态文件的明确建议:

https://expressjs.com/en/starter/static-files.html

app.use(express.static('public'))

实际上,这就是我实现它的方式,它的工作原理是:

app.use(express.static(path.resolve(__dirname,"../static")));

但问题是我的 URL 上的一些静态文件不是真正的静态文件,因为它们是动态构建的,用于处理请求。

例如:机器人 .txt站点地图.xml

所以现在,这就是我处理这个问题的方式:

app.get("/robots.txt", robotTxt_handler);
app.use(express.static(path.resolve(__dirname,"../static")));

这些特定文件路由位于 app.use(express.static()) 之前,因此它们会使用这些特定的处理程序进行响应。

但我想将该逻辑分离到另一个文件中的 express.router() 中。

像这样:

staticRouter.ts(静态路由器.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 属性作为 RegExp 传递。

因此,以下代码应该可以工作,但您需要格外小心静态文件中允许的字符。

链接到 Regex101

app.use(/^(\/[\w-]+)+(\.[\w-]+)+$/i, (req, res, next) => {
  return res.send("THIS IS A STATIC FILE ROUTE");
});

此正则表达式允许 a-z0-9-_ 作为文件夹和文件名中的容器。