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

问题描述 投票:0回答:2

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

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", ...)
中?

这可能吗?

node.js express routes middleware static-files
2个回答
0
投票

刚刚发现您可以将

path
属性作为正则表达式传递。

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

Regex101 链接

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

此正则表达式允许

a-z
0-9
-
_
成为文件夹和文件名中的容器。


0
投票

你可以做这样的事情来限制你的快速中间件,这对我有用。

if (req.originalUrl === '/site/') {
    logger.log('info', `Req-Time: ${date}`);
    next();
} else if (req) {
    next();
} else if (req) {
    next();
} else {
    next();
}
© www.soinside.com 2019 - 2024. All rights reserved.