更高级的静态文件服务在Express中

3
最好通过一个例子来解释。假设我有一个目录/images,其中有图片a.png、b.png和c.png。
然后我有一个目录/foo/images,其中有一张图片b.png,它与/images中的b.png不同。
我希望如果请求http://mydomain.com/foo/images/a.png,它将提供图像/images/a.png。但是,如果请求http://mydomain.com/foo/images/b.png,它会获取/foo/images中的b.png版本。也就是说,它首先检查foo/images/,如果没有这个文件,则回退到/images。
我可以使用res.sendfile()来实现这一点,但如果存在内置功能或优化模块,我更愿意使用它们,同时不失去可能由中间件提供的缓存等好处。
1个回答

3
这将拦截对/foo/images/的请求,如果文件不存在,则会重定向请求,仍然使用静态中间件并适当缓存。
var imageProxy = require('./imageProxy.js');

// intercept requests before static is called and change the url
app.use( imageProxy );

// this will still get cached
app.use( express.static(__dirname + '/public') );

在 imageProxy.js 文件内:

var url = require('url');
var fs  = require('fs');
var ROOT = process.execPath + '/public';

exports = function(req, res, next) {
   var parts = url.parse(req.url);
   // find all urls beginnig with /foo/images/
   var m = parts.pathname.match(/^(\/foo(\/images\/.*))/);
   if( m ) {
      // see if the override file exists
      fs.exists(ROOT+m[1], function (exists) {
         if( !exists ) { req.url = ROOT+m[2]; }
         // pass on the results to the static middleware
         next();
      });
   }
 });

如果出于某种原因您想访问原始URL,则可以在req.originalUrl处找到它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接