【问题标题】:Serve only .js files from an Express static directory?仅提供 Express 静态目录中的 .js 文件?
【发布时间】:2023-07-05 19:08:01
【问题描述】:

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

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

Static
    FileOne.js
    FileTwo.less
    FileThree.html
    FileFour.js

假设我想让任何给定请求具有.js 扩展名的文件可用,并且所有其他请求都会得到 500 响应(或类似的东西)。

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

【问题讨论】:

    标签: javascript regex node.js express static


    【解决方案1】:

    我用

    app.get(/static\/.*js$/, function(r, s){
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      var originalUrl = url.parse(req.originalUrl);
      

      你可以添加类似的东西

      if(originalUrl.slice(-3) != '.js') return next();
      

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

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

      app.use(require('lib/my-static'))
      

      【讨论】:

      • 谢谢@Qualcuno,我会尝试一下,看看我能想出什么。