这是关于如何提供静态文件的明确建议:
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
所以在我的主文件上我会这样做:
index.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
、-
和 _
成为文件夹和文件名中的容器。
你可以做这样的事情来限制你的快速中间件,这对我有用。
if (req.originalUrl === '/site/') {
logger.log('info', `Req-Time: ${date}`);
next();
} else if (req) {
next();
} else if (req) {
next();
} else {
next();
}