Node.js 动态设置express.static目录

Node.js 动态设置express.static目录,node.js,express,Node.js,Express,我想设置exress.static的根目录,使来自子域的请求具有单独的根文件夹 我有一个有多个子域名的网站,其结构如下 index.js public/ -- site1 -- site2 -- site3 当请求来自site1.mydomain.com且site2.mydomain.com无法从public/site1目录获取文件时,我想将public/site1设置为静态文件夹 我试过这个: app.use ((req, res, next) => { let hostName

我想设置exress.static的根目录,使来自子域的请求具有单独的根文件夹

我有一个有多个子域名的网站,其结构如下

index.js
public/
-- site1
-- site2
-- site3
当请求来自
site1.mydomain.com
site2.mydomain.com
无法从
public/site1
目录获取文件时,我想将
public/site1
设置为静态文件夹

我试过这个:

app.use ((req, res, next) => {
  let hostName = req.headers.host;
  let options = domainMap[hostName];

  req.app.use (
    express.static (path.join (__dirname, 'public', options.publicDir))
  );

  next ();
});
domainMap包含以下对象:

{
    site1:{
         publicDir:'site1',
    },
    site2:{
         publicDir:'site2',
    },
    site3:{
         publicDir:'site3',
    }
}

现在它只为第一个请求设置公共目录,但是有没有办法为每个请求动态更改i?

您可以动态生成所需的中间件函数,然后手动调用它。您不想将其注册到
app.use()
,因为这样它将对所有请求都处于活动状态。这就是为什么需要手动调用它。另外,
express.static()
生成一个已经调用
next()
的中间件,因此除了不调用生成的中间件外,您也不需要这样做

app.use ((req, res, next) => {
  let hostName = req.headers.host;
  let options = domainMap[hostName];
  // protect against missing or unexpected hostName
  if (options && options.publicDir) {
      let middleware = express.static(path.join (__dirname, 'public', options.publicDir));
      middleware(req, res, next);
  } else {
      // nothing to do here, keep routing
      next();
  }
});

这解决了这个问题,但我最终以一种符合我需求的方式重写了express的服务静态模块。谢谢你的聪明解决方案