2012-05-10 8 views
6

Sto utilizzando iisnode per ospitare un'applicazione Web nodo in IIS su Windows. Quando imposto i miei percorsi sul server web (ad esempio Express o Restify), voglio farlo in modo indipendente dal percorso in cui IIS ospita l'applicazione.Un'applicazione Web ospitata da iisnode può elaborare il percorso virtuale in cui è ospitata?

Ad esempio, la mia applicazione può essere ospitata su due percorsi diversi su due computer che eseguono IIS; il primo potrebbe ospitarlo a /foo e il secondo a /bar. Supponiamo che la mia applicazione voglia impostare un percorso a /baz - sulla prima macchina avrei bisogno di configurare il percorso a /foo/baz e sul secondo dovrei usare /bar/baz che significa duplicare parte della configurazione posseduta in IIS.

È possibile elaborare in modo affidabile il percorso all'interno di un'applicazione ospitata con iisnode in modo che sia possibile calcolare i percorsi corretti da impostare? O c'è un'altra tecnica che posso usare per evitare di doverlo fare?

risposta

3

Non sono a conoscenza di un modo per evitare di vedere il segmento di percorso corrispondente alla directory virtuale all'interno dell'applicazione node.js ospitata in iisnode. Il modo migliore per garantire il codice dell'applicazione è l'agnostico dell'host è ospitarla nella radice di un sito Web IIS.

+0

Questo non è possibile nel mio caso :( – GraemeF

+0

Questo è un peccato ... È piuttosto un problema dover usare il direttorio virtuale in tutti i percorsi (immagini, fogli di stile, percorsi, reindirizzamenti ...) – Alvaro

2

@GraemeF: Questo è un po 'hacky, ma questo è quello che ho risolto questa limitazione.

In primo luogo, ho aggiunto una variabile globale per la mia app chiamato casa:

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

Poi, ho creato i miei percorsi utilizzando la variabile casa:

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

Poi, è solo una questione di l'impostazione del deployPath appSetting nella vostra app web.config:

macchina 1:

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

Macchina 2:

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

È possibile impostare manualmente il valore su ogni macchina, avere il vostro processo di generazione impostato il valore, o anche aggiungere l'impostazione web.config globale della macchina di destinazione.

+0

@Tomasz, sarebbe possibile impostare una variabile di ambiente di processo su HttpRuntime.AppDomainAppVirtualPath? Normalmente, vorrei solo inviare una richiesta di pull, ma non conosco proprio il C++ – Jason

+0

Questo è praticamente quello che ho fatto, ma non è davvero risolvendo il percorso, stiamo solo barando dicendoglielo! Mi piacerebbe davvero evitare di dover aggiungere questo passaggio di configurazione aggiuntivo. (Inoltre, non so se Tomasz vedrà il tuo suggerimento lì!) – GraemeF

+0

I ha anche creato un problema in github. – Jason

1

This answer suggerisce di ottenere il percorso dal file web.config.

Inoltre, this link potrebbe essere di qualche aiuto così:

La soluzione risulta essere ben affrontate, almeno per "esprimere" quadro di app mediante app.use()

Quando si chiama app.use (app.router), puoi passare un prefisso dello spazio dei nomi per la tua directory virtuale e quindi le richieste avranno esito positivo, MA chi vorrebbe codificare il proprio nome di directory virtuale nella propria app [yuck!]?

La soluzione risulta abbastanza semplice poiché IISNODE promuove le impostazioni delle app per le variabili di ambiente. Approfittando di questo fatto, è possibile aggiungere una voce al Web delle app.config come ad esempio:

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

Poi si può fare una semplice modifica al file server.js in questo modo:

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

Entrambi esprimono e restify consentire la definizione di percorsi con regex. Utilizzando i percorsi di espressioni regolari è possibile evitare completamente problemi di prefisso.

Invece di

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

uso

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

e non ci sarà bisogno di alcuna magia.

Problemi correlati