我的模板设置因我正在使用的子域而异。因此,我试图找到一种方法来根据我正在使用的子域名动态设置express.static。
当app.use运行时,模板未定义。如果我在app.get中运行app.use,则超出范围。如果我尝试从一个函数运行app.use,它也超出了范围。
“template”是我在app.get中获取的变量,它是我的子域和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});
});
});
我很确定它与范围有关,但到目前为止我还没能解决它。任何帮助将不胜感激
答案 0 :(得分:1)
当您的服务器首次启动时,您的第一个app.use()
和express.static()
来电就会运行。此时,template
变量尚未具有值。你不能按照你尝试的方式做事。
app.get()
也会立即运行,但是在将来某个匹配该路由的http请求实际到达时,才会调用其回调。到那时,当template
变量被分配时,它在以前的app.use()
语句中用得太晚了。
如果您的服务器只是知道它最初是从配置文件或类似的东西设置时服务的子域,那么这将会容易得多。如果您打算让同一台服务器同时提供多个子域,并且您希望它根据子域提供不同的文件,那么您必须完全不同的编码,因为您不能只使用像{一样的普通路由匹配{1}}因为您真正想要的是子域+路由匹配,这是我不知道的内置功能。</ p>
我想如果我试图解决这个问题,我会让我的第一个中间件检查请求的子域并将其插入到URL的前面,为每个子域创建一个唯一的伪URL 。然后,您可以在该伪URL上进行正常路由,这是其他中间件和路由将作为请求URL看到的。