6

我正在使用iisnode在 Windows 上的 IIS 中托管节点 Web 应用程序。当我在 Web 服务器(比如 Express 或 Restify)上设置路由时,我希望以一种独立于 IIS 托管应用程序的路径的方式来完成。

例如,我的应用程序可以托管在运行 IIS 的两台机器上的两条不同路径上;第一个可以在 举办,/foo第二个可以在/bar. 假设我的应用程序想要在第一台机器上设置路由,/baz我需要在第一台机器上配置路由,/foo/baz而在第二台机器上我必须使用/bar/baz这意味着复制 IIS 中保存的一些配置。

是否可以从 iisnode 托管的应用程序中可靠地计算出路径,以便我可以计算正确的设置路径?还是我可以使用另一种技术来避免这样做?

4

4 回答 4

3

我不知道有一种方法可以避免在 iisnode 中托管的 node.js 应用程序中看到与虚拟目录相对应的路径段。确保您的应用程序代码与主机无关的最佳方法是将其托管在 IIS 网站的根目录中。

于 2012-05-10T19:02:25.213 回答
2

@GraemeF:这有点老套,但这就是我绕过这个限制的人。

首先,我在名为 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。

于 2012-06-27T13:37:00.983 回答
1

这个答案建议从web.config文件中获取路径。

此外,此链接也可能会有所帮助:

事实证明,该解决方案得到了很好的解决,至少对于使用 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);
....
});
于 2015-11-20T11:46:28.523 回答
0

express 和 restify 都允许使用正则表达式定义路径。通过使用正则表达式路径,您可以完全避免前缀问题。

代替

server.get({ path: '/virtual/directory/structure/status/',...

利用

server.get({ path: /.*\/status/,...

并且不需要任何魔法。

于 2016-09-16T04:17:24.780 回答