我正在使用iisnode在Windows上的IIS中托管节点Web应用程序。当我在Web服务器上设置我的路由(比如Express或Restify)时,我希望以一种独立于IIS托管应用程序的路径的方式进行。
例如,我的应用程序可以在运行IIS的两台计算机上的两个不同路径上托管;第一个可以在/foo
托管,第二个托管在/bar
。假设我的应用程序想要在/baz
设置路由 - 在第一台机器上我需要在/foo/baz
配置路由,在第二台机器上我必须使用/bar/baz
这意味着重复IIS中的一些配置。
是否可以从使用iisnode托管的应用程序中可靠地计算出路径,以便我可以计算出要设置的正确路由?或者是否有其他技术可以避免需要这样做?
答案 0 :(得分:3)
我不知道如何避免在iisnode中托管的node.js应用程序中看到与虚拟目录对应的路径段。确保应用程序代码与主机无关的最佳方法是将其托管在IIS网站的根目录下。
答案 1 :(得分:2)
@GraemeF:这有点像hacky,但这就是我解决这个问题的原因。
首先,我在我的应用程序中添加了一个名为home的全局变量:
var express = require('express'),
app = express.createServer(),
home = process.env.deployPath || '';
然后,我使用home变量设置我的路线:
app.get(home + '/baz', function(req, res) {
res.send('This is the /baz route');
res.end();
});
然后,只需在应用程序web.config中设置deployPath appSetting即可:
机器1:
<appSettings>
<add key="deployPath" value="/foo" />
</appSettings>
机器2:
<appSettings>
<add key="deployPath" value="/bar" />
</appSettings>
您可以在每台计算机上手动设置值,让构建过程设置该值,甚至将设置添加到目标计算机的全局web.config。
答案 2 :(得分:1)
This answer建议从web.config
文件中获取路径。
此外,this link也可能有所帮助:
该解决方案得到了很好的解决,至少对于使用app.use()的“快速”框架应用而言
当您调用app.use(app.router)时,您可以为您的虚拟目录传递名称空间前缀,然后请求将成功但是谁想要将其虚拟目录名称硬编码到他们的应用程序中[yuck!]?
解决方案结果非常简单,因为IISNODE将appSettings提升为环境变量。利用这一事实,您可以在应用程序web.config中添加一个条目,例如:
<appSettings>
<add key="appvirtdir" value="/nodetest" />
</appSettings>
然后你可以对你的server.js文件做一个简单的修改:
app.configure(function () {
....
app.use(process.env.appvirtdir || '', app.router);
....
});
答案 3 :(得分:0)
表达和解析都允许使用正则表达式定义路径。通过使用正则表达式路径,您可以完全避免前缀问题。
而不是
server.get({ path: '/virtual/directory/structure/status/',...
使用
server.get({ path: /.*\/status/,...
并且不需要任何魔法。