2012-05-10 28 views
6

Tôi đang sử dụng iisnode để lưu trữ ứng dụng web nút trong IIS trên Windows. Khi tôi thiết lập các tuyến đường của tôi trên máy chủ web (nói Express hoặc Restify), tôi muốn làm điều đó theo cách độc lập với đường dẫn mà IIS đang lưu trữ ứng dụng tại.Ứng dụng web được lưu trữ trên iisnode có hoạt động trên đường dẫn ảo được lưu trữ trên đó không?

Ví dụ, ứng dụng của tôi có thể được lưu trữ tại hai đường dẫn khác nhau trên hai máy chạy IIS; người đầu tiên có thể lưu trữ nó tại /foo và thứ hai tại /bar. Giả sử ứng dụng của tôi muốn thiết lập một tuyến đường tại /baz - trên máy đầu tiên tôi sẽ cần phải định cấu hình tuyến đường tại /foo/baz và vào thứ hai, tôi sẽ phải sử dụng /bar/baz có nghĩa là sao chép một số cấu hình được giữ trong IIS.

Có thể làm việc một cách đáng tin cậy đường dẫn từ bên trong một ứng dụng được lưu trữ bằng iisnode để tôi có thể tính toán các tuyến đường chính xác để thiết lập không? Hay là có một kỹ thuật khác mà tôi có thể sử dụng để tránh phải làm như vậy?

Trả lời

3

Tôi không biết cách nào để tránh nhìn thấy phân khúc đường dẫn tương ứng với thư mục ảo trong ứng dụng node.js của bạn được lưu trữ trong iisnode. Cách tốt nhất để đảm bảo mã ứng dụng của bạn là chủ bất khả tri là lưu trữ nó ở gốc của trang web IIS.

+0

Điều đó không thể xảy ra trong trường hợp của tôi: ( – GraemeF

+0

Thật đáng tiếc ... phải sử dụng directoy ảo trong tất cả các đường dẫn (hình ảnh, biểu định kiểu, tuyến đường, chuyển hướng ...) – Alvaro

2

@GraemeF: Đây là một chút hacky, nhưng đây là những người tôi có xung quanh giới hạn này.

Đầu tiên, tôi đã thêm một biến toàn cầu để gọi là nhà ứng dụng của tôi:

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

Sau đó, tôi thiết lập các tuyến đường của tôi bằng cách sử dụng biến nhà:

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

Sau đó, nó chỉ là một vấn đề thiết lập ứng dụng deployPathĐặt trong ứng dụng web.config:

Máy 1:

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

Máy 2:

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

Bạn có thể tự thiết lập giá trị trên mỗi máy, có quá trình xây dựng của bạn thiết lập giá trị, hoặc thậm chí thêm các thiết lập để web.config toàn cầu máy mục tiêu của.

+0

@Tomasz, nó sẽ có thể thiết lập một biến môi trường quá trình để HttpRuntime.AppDomainAppVirtualPath? Thông thường, tôi sẽ chỉ cần gửi một yêu cầu kéo, nhưng tôi không biết C + + ở tất cả các – Jason

+0

Đó là khá nhiều những gì tôi đã làm, nhưng nó không thực sự chúng tôi chỉ đang lừa dối bằng cách nói với nó! Tôi thực sự muốn tránh phải thêm bước cấu hình bổ sung này. (Ngoài ra, tôi không biết nếu Tomasz sẽ thấy gợi ý của bạn ở đó!) – GraemeF

+0

I cũng tạo ra một vấn đề trong github. – Jason

1

This answer đề xuất nhận đường dẫn từ tệp web.config.

Ngoài ra, this link có thể giúp đỡ một số cũng như:

Giải pháp hóa ra phải được giải quyết tốt, ít nhất là cho "tốc hành" khuôn khổ ứng dụng sử dụng app.use()

Khi bạn gọi app.use (app.router), bạn có thể chuyển tiền tố không gian tên cho thư mục ảo của bạn và sau đó các yêu cầu sẽ thành công NHƯNG ai muốn mã hóa tên thư mục ảo của họ vào ứng dụng của họ [yuck!]?

Giải pháp hóa ra khá đơn giản vì IISNODE quảng bá các cài đặt ứng dụng cho các biến môi trường. Lợi dụng thực tế này, bạn có thể thêm mục nhập vào web ứng dụng.cấu hình như:

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

Sau đó, bạn có thể làm cho một thay đổi đơn giản để tập server.js của bạn như thế này:

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

Cả hai bày tỏ và restify cho phép định nghĩa các đường dẫn với regex. Bằng cách sử dụng đường dẫn regex, bạn có thể tránh hoàn toàn các vấn đề tiền tố.

Thay vì

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

sử dụng

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

và sẽ có không cần bất kỳ ma thuật.

Các vấn đề liên quan