基于ExpressJS中文件扩展名的中间件执行

时间:2013-12-08 21:13:07

标签: node.js express

在Express中是否有任何标准方法将文件扩展名映射到特定的中间件适配器?

当生成中以".map"结尾的文件扩展名请求时,我想明确返回404,但在开发过程中,文件将被提供/允许(如果存在)。

此外,我注意到如果"map"文件(the source map file)不存在,即使文件不存在,会话提供程序仍会激活该请求(是低效的)。因此,这也有助于防止不必要的会话加载/保存。

在安装session的中间件之前,我添加了以下代码:

app.use(function(req, res, next) {
    if (req && req.originalUrl) {
        var originalUrl = url.parse(req.originalUrl);
        var testMap = /^.*\.map$/;
        if (testMap.test(originalUrl.pathname)) {
            console.log("[MAP] %s %s", req.method, req.url);
            res.send(404);
            res.end();
            return;
        } else {
            next();
        }            
    }
});

虽然有效:

[MAP] GET /javascripts/vendor/jquery.min.map

我以为我可以使用use的第一个参数指定文件路径(特别是扩展名)?但是,我似乎无法使语法正确(我尝试了上面使用的正则表达式,但它似乎不起作用)。

编辑(以下是来自app.js文件的块上方的行):

// all environments
app.set('port', process.env.PORT || 4000);
app.set('views', path.join(process.cwd(), 'views'));
app.set('view engine', 'dust');
app.engine('dust', dustjs.dust({
    layout: 'main_layout',
    cache: false
}));

app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.methodOverride());
app.use(express.cookieParser(cookieSecret));

// I've tried to move this before and after the "map" code, to no effect
app.use(express.static(path.join(__dirname, 'public')));

1 个答案:

答案 0 :(得分:1)

这应该有用;

app.use('*.map', function (req, res, next) {
  // disable requests ending in .map in production
  if ('production' === app.get('env')) {
    console.log("[MAP] %s %s", req.method, req.url);
    res.send(404);
  } else {
    next();
  }
});