【问题标题】:How to create a middleware to respond to all static file requests on express?如何创建一个中间件来响应 express 上的所有静态文件请求?
【发布时间】:2021-04-22 21:53:13
【问题描述】:

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

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

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

其实我就是这样实现的,而且效果很好:

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

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

例如:robots.txtsitemap.xml

所以现在,我就是这样处理的:

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

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

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

类似:

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

这可能吗?

【问题讨论】:

  • 看看 npm express-robots 看看作者是如何做到的,或者只是为了使用它。
  • 谢谢。我的问题不是如何生成robots.txt 文件。我只需要一种方法将所有static 文件逻辑提取到一个单独的文件中。

标签: node.js express routes middleware static-files


【解决方案1】:

刚刚发现您可以将path 属性作为正则表达式传递。

所以下面的代码应该可以工作,但您需要特别注意静态文件中允许的字符。

Link to Regex101

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

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

【讨论】:

    猜你喜欢
    • 2018-10-17
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多