我可以根据请求通过哪个域来设置环境变量吗?
我在想的是我已经启动并运行了我的node.js应用程序,我分配了两个域,相同的域,具有不同的TLD:如下所示
mydomain.fr
mydomain.de
并执行类似此伪代码的操作
switch(app.host) {
case 'mydomain.fr':
process.env.LANGUAGE = 'fr';
break;
case 'mydomain.de':
process.env.LANGUAGE = 'de';
break;
default:
process.env.LANGUAGE = 'en';
break;
}
我想这样做是因为我真的想使用像i18n
这样的节点模块或类似但使用相同的代码库,然后在特定的json文件中添加不同的语言变量。
如果我想在像意大利(.it)这样的新国家或其他任何地方推出我的网站,这将使其变得容易多了。如果我将更新推送到网站,它会自动推送到所有语言。
我的主要问题现在是第一个:这可能吗? 第二,这种方法的优点和缺点是什么?我已经列出了一些专业人员,现在唯一可以想到的是,如果我在不同的服务器上设置页面,那么一个Web服务器需要比我想要的更大/更强。
值得一提的是,每个语言网站的流量都相当低(两种语言每月低于10k)
值得一提的另一个提及是,如果重要的话,我计划将这些网站部署到Heroku。
答案 0 :(得分:2)
如果两个域同时运行,它将无法工作。
node.js中的process
等全局变量就是:global。如果您运行两个服务(应用程序)会发生什么,第一个将变量process.env.LANGUAGE
设置为某个值,第二个将覆盖它。
如果按连接进行,它甚至不会起作用。来自法国的第一位客户将process.env.LANGUAGE
设置为fr
,然后来自德国的第二位客户将其设置为de
,然后当您回复第一位客户(法国人)时,您将最后用德语给他一页。
请记住,虽然node.js只是单线程,但我们仍然需要担心多个连接,因为它们可以是并发的。
附加此类内容的正确位置是您为每个连接唯一获取的变量:请求对象和响应对象(通常缩写为req
和res
)。如果您想要标准的东西,请使用中间件向请求对象添加伪标头。我亲自做req.lang = 'de'
;