Zoeken…


Opmerkingen

Virtuele map / geneste applicatie met Views Pitfall

Als u Express gaat gebruiken om weergaven weer te geven met een View Engine, moet u de waarde virtualDirPath doorgeven aan uw weergaven

`res.render('index', { virtualDirPath: virtualDirPath });`

De reden hiervoor is om uw hyperlinks naar andere weergaven te laten hosten door uw app en statische bronpaden om te weten waar de site wordt gehost zonder dat u alle weergaven na implementatie hoeft te wijzigen. Dit is een van de meest irritante en vervelende valkuilen van het gebruik van virtuele mappen met IISNode.

versies

Alle bovenstaande voorbeelden werken met

  • Express v4.x
  • IIS 7.x / 8.x
  • Socket.io v1.3.x of hoger

Ermee beginnen

Met IISNode kunnen Node.js- webapps worden gehost op IIS 7/8, net zoals een .NET-toepassing. Natuurlijk kunt u uw node.exe proces zelf hosten op Windows, maar waarom zou u dat doen als u uw app gewoon in IIS kunt uitvoeren?

IISNode zorgt voor het schalen over meerdere kernen, het procesbeheer van node.exe en het automatisch recyclen van uw IIS-toepassing wanneer uw app wordt bijgewerkt, om maar enkele voordelen te noemen.

Voorwaarden

IISNode heeft een paar vereisten voordat u uw Node.js-app in IIS kunt hosten.

  1. Node.js moet op de IIS-host zijn geïnstalleerd, 32-bits of 64-bits, beide worden ondersteund.
  2. IISNode heeft x86 of x64 geïnstalleerd, dit moet overeenkomen met de bitheid van uw IIS-host.
  3. De Microsoft URL-herschrijfmodule voor IIS geïnstalleerd op uw IIS-host.
    • Dit is belangrijk, anders werken aanvragen voor uw Node.js-app niet zoals verwacht.
  4. Een Web.config in de hoofdmap van uw Node.js-app.
  5. IISNode-configuratie via een iisnode.yml bestand of een <iisnode> -element in uw Web.config .

Basic Hello World-voorbeeld met Express

Om dit voorbeeld te laten werken, moet u een IIS 7/8-app op uw IIS-host maken en de map met de Node.js-webapp toevoegen als de fysieke map. Zorg ervoor dat uw Application / Application Pool Identity toegang heeft tot de Node.js-installatie. In dit voorbeeld wordt de 64-bits installatie van Node.js gebruikt.

Projectstructuur

Dit is de basisprojectstructuur van een IISNode / Node.js-webapp. Het ziet er bijna identiek uit aan elke niet-IISNode Web-app behalve de toevoeging van Web.config .

- /app_root
  - package.json
  - server.js
  - Web.config

server.js - Snelle toepassing

const express = require('express');
const server = express();

// We need to get the port that IISNode passes into us 
// using the PORT environment variable, if it isn't set use a default value
const port = process.env.PORT || 3000;

// Setup a route at the index of our app    
server.get('/', (req, res) => {
    return res.status(200).send('Hello World');
});

server.listen(port, () => {
    console.log(`Listening on ${port}`);
});

Configuratie & Web.config

Web.config is net als elke andere IIS Web.config behalve dat de volgende twee dingen aanwezig moeten zijn, URL <rewrite><rules> en een IISNode <handler> . Beide elementen zijn <system.webServer> elementen van het element <system.webServer> .

Configuratie

U kunt IISNode configureren door een iisnode.yml bestand te gebruiken of door het element <iisnode> toe te voegen als een kind van <system.webServer> in uw Web.config . Beide configuratie kan worden gebruikt in combinatie met elkaar maar in dit geval Web.config moet het specificeren iisnode.yml bestand en elke configuratie conflicten nemen van zijn iisnode.yml bestand plaats . Deze configuratie kan niet andersom gebeuren.

IISNode Handler

Om IIS te laten weten dat server.js onze Node.js- server.js bevat, moeten we dat expliciet vertellen. We kunnen dit doen door de IISNode <handler> te voegen aan het element <handlers> .

<handlers>
  <add name="iisnode" path="server.js" verb="*" modules="iisnode"/>
</handlers>

Regels voor URL-herschrijven

Het laatste deel van de configuratie is ervoor te zorgen dat verkeer dat is bedoeld voor onze Node.js-app die ons IIS-exemplaar binnenkomt, wordt doorgestuurd naar IISNode. Zonder regels voor het herschrijven van URL's zouden we onze app moeten bezoeken door naar http://<host>/server.js en nog erger, wanneer u probeert een door server.js geleverde bron aan te server.js , krijgt u een 404 . Daarom is herschrijven van URL's noodzakelijk voor IISNode-webapps.

<rewrite>
    <rules>
        <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
        <rule name="StaticContent" patternSyntax="Wildcard">
            <action type="Rewrite" url="public/{R:0}" logRewrittenUrl="true"/>
            <conditions>
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
            </conditions>
            <match url="*.*"/>
        </rule>

        <!-- All other URLs are mapped to the Node.js application entry point -->
        <rule name="DynamicContent">
            <conditions>
                <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
            </conditions>
            <action type="Rewrite" url="server.js"/>
        </rule>
    </rules>
</rewrite>

Dit is een werkend Web.config bestand voor dit voorbeeld , installatie voor een 64-bit Node.js-installatie.


Dat is alles, bezoek nu uw IIS-site en zie hoe uw Node.js-applicatie werkt.

Een IIS Virtual Directory of geneste toepassing gebruiken via

Het gebruik van een virtuele map of geneste toepassing in IIS is een veelvoorkomend scenario en waarschijnlijk waar u van wilt profiteren bij het gebruik van IISNode.

IISNode biedt geen directe ondersteuning voor virtuele mappen of geneste toepassingen via configuratie, dus om dit te bereiken moeten we profiteren van een functie van IISNode die geen deel uitmaakt van de configuratie en veel minder bekend is. Alle <appSettings> elementen van het element <appSettings> met Web.config worden als eigenschappen toegevoegd aan het object process.env met de sleutel appSetting.

Laten we een virtuele map maken in onze <appSettings>

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

Binnen onze Node.js-app hebben we toegang tot de instelling virtualDirPath

console.log(process.env.virtualDirPath); // prints /foo

Nu we het <appSettings> -element voor configuratie kunnen gebruiken, laten we daar voordeel uit halen en gebruiken in onze servercode.

// Access the virtualDirPath appSettings and give it a default value of '/'
// in the event that it doesn't exist or isn't set
var virtualDirPath = process.env.virtualDirPath || '/';

// We also want to make sure that our virtualDirPath 
// always starts with a forward slash
if (!virtualDirPath.startsWith('/', 0))
  virtualDirPath = '/' + virtualDirPath;

// Setup a route at the index of our app    
server.get(virtualDirPath, (req, res) => {
    return res.status(200).send('Hello World');
});

We kunnen virtualDirPath ook gebruiken met onze statische bronnen

// Public Directory
server.use(express.static(path.join(virtualDirPath, 'public')));
// Bower
server.use('/bower_components', express.static(path.join(virtualDirPath, 'bower_components')));

Laten we dat allemaal samenbrengen

const express = require('express');
const server = express();

const port = process.env.PORT || 3000;

// Access the virtualDirPath appSettings and give it a default value of '/'
// in the event that it doesn't exist or isn't set
var virtualDirPath = process.env.virtualDirPath || '/';

// We also want to make sure that our virtualDirPath 
// always starts with a forward slash
if (!virtualDirPath.startsWith('/', 0))
  virtualDirPath = '/' + virtualDirPath;

// Public Directory
server.use(express.static(path.join(virtualDirPath, 'public')));
// Bower
server.use('/bower_components', express.static(path.join(virtualDirPath, 'bower_components')));

// Setup a route at the index of our app    
server.get(virtualDirPath, (req, res) => {
    return res.status(200).send('Hello World');
});

server.listen(port, () => {
    console.log(`Listening on ${port}`);
});

Socket.io gebruiken met IISNode

Om Socket.io met IISNode te laten werken, zijn de enige noodzakelijke wijzigingen bij het niet gebruiken van een Virtual Directory / Nested Application binnen Web.config .

Aangezien Socket.io verzoeken verzendt die beginnen met /socket.io , moet IISNode communiceren met IIS dat deze ook moeten worden afgehandeld IISNode en niet alleen statische bestandsverzoeken of ander verkeer moeten zijn. Dit vereist een andere <handler> dan standaard IISNode-apps.

<handlers>
    <add name="iisnode-socketio" path="server.js" verb="*" modules="iisnode" />
</handlers>

Naast de wijzigingen in de <handlers> we ook een aanvullende regel voor het herschrijven van URL's toevoegen. De herschrijfregel stuurt alle /socket.io naar ons serverbestand waar de Socket.io-server actief is.

<rule name="SocketIO" patternSyntax="ECMAScript">
    <match url="socket.io.+"/>
    <action type="Rewrite" url="server.js"/>
</rule>

Als u IIS 8 gebruikt, moet u de instelling van uw webSockets in uw Web.config uitschakelen, naast het toevoegen van de bovenstaande handler en herschrijfregels. Dit is niet nodig in IIS 7 omdat er geen webSocket-ondersteuning is.

<webSocket enabled="false" />



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow