2012-05-10 10 views
6

Estoy usando iisnode para alojar una aplicación web de nodo en IIS en Windows. Cuando configuro mis rutas en el servidor web (por ejemplo, Express o Restify) quiero hacerlo de una manera que sea independiente de la ruta en la que IIS aloja la aplicación.¿Puede una aplicación web alojada en iNodode resolver la ruta virtual en la que está alojada?

Por ejemplo, mi aplicación podría alojarse en dos rutas diferentes en dos máquinas que ejecutan IIS; el primero podría alojarlo en /foo y el segundo en /bar. Supongamos que mi aplicación quiere configurar una ruta al /baz - en la primera máquina necesitaría configurar la ruta en /foo/baz y en la segunda tendría que usar /bar/baz, lo que significa duplicar parte de la configuración guardada en IIS.

¿Es posible calcular la ruta desde una aplicación hospedada con iisnode de manera confiable para que pueda calcular las rutas correctas para configurar? ¿O hay otra técnica que pueda usar para evitar tener que hacerlo?

Respuesta

3

No conozco una forma de evitar ver el segmento de ruta correspondiente al directorio virtual dentro de su aplicación node.js alojada en iisnode. La mejor forma de garantizar que el código de la aplicación sea independiente del host es alojarlo en la raíz de un sitio web de IIS.

+0

Eso no es posible en mi caso :( – GraemeF

+0

Esto es una lástima ... Es un dolor tener que usar el directorio virtual en todos los caminos (imágenes, hojas de estilo, rutas, redirecciones ...) – Alvaro

2

@GraemeF: Esto es un poco hacky, pero esto es lo que tengo alrededor de esta limitación.

En primer lugar, he añadido una variable global a mi aplicación llamada casa:

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

A continuación, he creado mis rutas utilizando la variable de casa:

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

Entonces, es sólo una cuestión de estableciendo el deployPath appSetting aplicaciones en su web.config:

máquina 1:

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

Máquina 2:

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

Puede configurar manualmente el valor en cada máquina, tiene su proceso de construcción establece el valor, o incluso añadir la configuración de web.config global de la máquina de destino.

+0

@Tomasz, sería posible establecer una variable de entorno de proceso para HttpRuntime.AppDomainAppVirtualPath? Normalmente, enviaría una solicitud de extracción, pero no sé C++ en absoluto. – Jason

+0

Eso es más o menos lo que hice, pero no es realmente Averiguar cuál es la ruta, solo estamos haciendo trampa diciéndola. Realmente me gustaría evitar tener que agregar este paso de configuración adicional. (¡Además, no sé si Tomasz verá tu sugerencia allí!) – GraemeF

+0

I también creó un problema en github. – Jason

1

This answer sugiere obtener la ruta desde el archivo web.config.

Además, this link podría ser de alguna ayuda, así:

La solución resulta estar bien dirigida, al menos para "expresar" marco de aplicaciones usando app.use()

Cuando llame a app.use (app.router), puede pasar un prefijo de espacio de nombres para su directorio virtual y luego las solicitudes tendrán éxito PERO ¿quién querría codificar el nombre de su directorio virtual en su aplicación [yuck!]?

La solución resulta bastante simple porque IISNODE promueve appSettings a variables de entorno. Aprovechando este hecho, puede agregar una entrada a la web de aplicaciones.config tales como:

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

A continuación, puede hacer una simple modificación en el archivo de server.js así:

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

Ambos expresan y restify permite la definición de caminos con regex Al usar rutas de expresiones regulares, puedes evitar problemas de prefijos por completo.

En lugar de

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

uso

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

y no habrá necesidad de ningún tipo de magia.

Cuestiones relacionadas