仅提供来自 Express 静态目录的 .js 文件?

AJB*_*AJB 5 javascript regex static node.js express

我正在寻找是否可以从 Express.js 静态目录中仅提供一种类型的文件(按扩展名过滤)。

例如,假设我有以下静态目录:

Static
    FileOne.js
    FileTwo.less
    FileThree.html
    FileFour.js
Run Code Online (Sandbox Code Playgroud)

说我想打用一个文件.js到任何给定的要求提供的扩展,以及所有其他请求会得到响应500(或类似的东西)。

我将如何实现这一目标?Express 是否有我找不到的内置过滤器,或者我是否需要使用正则表达式?

Joh*_*ams 6

我用

app.get(/static\/.*js$/, function(r, s){
Run Code Online (Sandbox Code Playgroud)

或者

app.get('*', function(r, s){
  if(r.url.match(/.*js$/)) // then serve
})
Run Code Online (Sandbox Code Playgroud)


Ita*_*Ale 2

在我看来,您不能以这种方式配置“静态”中间件。在“serve-static”模块中,它是 Express 4.0(目前处于 RC 阶段)“static”的替代品,有一些选项,但没有过滤。

如果您只想提供 *.js 文件,您可以自己创建一个路由。如果请求的文件是 .js,则创建一个app.get('/static/*')响应文件内容和正确的 mime 类型的文件。

另一种方法是分叉“static”模块,或者更好的新“serve-static”模块,这样它就可以满足您的需求。例如,您可以创建一个新库,复制该文件的内容,并在该行之后

var originalUrl = url.parse(req.originalUrl);
Run Code Online (Sandbox Code Playgroud)

你可以添加类似的东西

if(originalUrl.slice(-3) != '.js') return next();
Run Code Online (Sandbox Code Playgroud)

这应该忽略(调用下一个中间件)对不以“.js”结尾的静态文件的所有请求。(未经测试,但受到上面代码的启发)

使用上面的代码,创建一个新库(例如将其保存在“lib/my-static.js”中)并包含它:

app.use(require('lib/my-static'))
Run Code Online (Sandbox Code Playgroud)