Express.js试图用variables设置express.static

我有不同的模板设置,取决于我使用的子域。 因此,我试图find一种方法来设置express.staticdynamic根据我使用的子域名。

当app.use运行时,模板是未定义的。 如果我在app.get中运行app.use,它超出了范围。 如果我尝试从一个函数运行app.use,它也超出了范围。

“模板”是我在app.get中获得的variables,它是我的子域和http请求

app.use('/subdomain/:domain/bower',express.static(path.join(__dirname, '/public/' + **template** + '/bower'))); app.get('/subdomain/:domain',function(req,res,next) { get('/stores/template/' + req.params.domain) .then(function(body){ console.log("template: " + body.toString()); template = body; res.render('store',{store:req.params.domain}); }); }); 

我很确定它与范围有关,但到目前为止我还没有能够解决它。 任何帮助,将不胜感激

您的第一个app.use()express.static()调用在您的服务器首次启动时运行。 在那个时候, templatevariables还没有一个值。 你不能像你试图做的那样真正做事。

app.get()也立即运行,但是它的callback在未来的某个时候不会被调用,当一个匹配该路由的http请求实际到达时。 到那时,当templatevariables被赋值时,在之前的app.use()语句中,它太有用了。

如果你的服务器刚刚从configuration文件或类似的东西中build立起来的时候,服务器可以知道它所服务的是哪个子域,这将会容易得多。 如果您希望同一台服务器同时为多个子域服务,并且希望它根据子域提供不同的文件,那么您将不得不完全不同的代码,因为您不能使用普通路由匹配,如express.static() ,因为你真正想要的是子域+路由匹配,这不是我所知道的内置function。

我想如果我正在试图解决这个问题,我会让我的第一个中间件检查请求的子域,并将其插入到URL的前面,为每个子域创build一个唯一的伪URL。 然后,您可以对该伪url执行正常路由,这是其余中间件和路由将看到的请求URL。