2012-05-10 20 views
6

我正在使用iisnode在Windows上的IIS中承載節點Web應用程序。當我在Web服務器上設置我的路由時(比如說Express或Restify),我想以獨立於IIS託管應用程序的路徑的方式進行操作。iisnode託管的Web應用程序是否可以處理託管它的虛擬路徑?

例如,我的應用程序可以託管在運行IIS的兩臺機器上的兩個不同路徑上;第一個可以寄存在/foo,第二個寄存在/bar。說我的應用程序要建立一個路徑在/baz - 第一臺計算機上,我需要在/foo/baz和第二路由的配置方法我將不得不使用/bar/baz這意味着複製一些在IIS舉行的配置。

是能夠可靠地從iisnode託管,這樣我可以計算出正確的路線,建立一個應用程序內製定出的路徑?還是有另一種技術可以用來避免需要這樣做?

回答

3

我不知道的方式,以避免看到對應於您在iisnode託管Node.js應用程式內虛擬目錄的路徑段。確保應用程序代碼與主機無關的最佳方法是將其託管在IIS網站的根目錄下。

+0

這在我的情況下是不可能的:( – GraemeF

+0

這真是太遺憾了......在所有路徑(圖像,樣式表,路徑,重定向...)中使用虛擬directoy是一個非常痛苦的工作 – Alvaro

2

@GraemeF:這是一個有點哈克,但這是我繞過這個限制了誰。

首先,我添加了一個全局變量,以我的應用程序打電話回家:

var express = require('express'), 
    app = express.createServer(), 
    home = process.env.deployPath || ''; 

然後,我用家裏變量設置我的路線:

app.get(home + '/baz', function(req, res) { 
    res.send('This is the /baz route'); 
    res.end(); 
}); 

然後,它只是一個事設置deployPath appSetting在您的應用程序的web.config:

機1:

<appSettings> 
    <add key="deployPath" value="/foo" /> 
</appSettings> 

機2:

<appSettings> 
    <add key="deployPath" value="/bar" /> 
</appSettings> 

您可以手動設置每臺機器上的價值,有您的構建過程中設置的值,甚至添加設置到目標機的全球web.config中。

+0

@Tomasz,是否可以將進程環境變量設置爲HttpRuntime.AppDomainAppVirtualPath?通常情況下,我只需提交一個拉取請求,但我根本不知道C++。 – Jason

+0

這幾乎是我所做的,但它並不是真的弄清楚路徑是什麼,我們只是通過告訴它而作弊!我真的很想避免增加這個額外的配置步驟(另外,我不知道Tomasz是否會在那裏看到你的建議!) – GraemeF

+0

I也在github中創建了一個問題。 – Jason

1

This answer建議從web.config文件中獲取的路徑。

此外,this link可能會有所幫助,以及:

該解決方案可謂是很好的解決,至少對「表達」框架應用使用的app.use()

當你調用app.use(app.router),你可以爲你的虛擬目錄傳遞一個命名空間前綴,然後請求會成功,但誰願意將它們的虛擬目錄名稱硬編碼到他們的應用中[yuck!]?

該解決方案被證明是非常簡單的,因爲IISNODE促進的appSettings環境變量。利用這一事實,您可以添加一個條目到應用程序網站。配置如:

<appSettings> 
     <add key="appvirtdir" value="/nodetest" /> 
</appSettings> 

然後你就可以做一個簡單的修改你的server.js文件是這樣的:

app.configure(function() { 
.... 
    app.use(process.env.appvirtdir || '', app.router); 
.... 
}); 
0

有明示的RESTify允許的路徑與定義正則表達式。通過使用正則表達式路徑,您可以完全避免前綴問題。

而不是

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

使用

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

而且會在不需要任何魔法。