Sök…


Anmärkningar

Virtual Directory / Nested Application with Views Pitfall

Om du ska använda Express för att återge vyer med hjälp av en View Engine måste du virtualDirPath värdet till dina vyer

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

Anledningen till att göra detta är att göra dina hyperlänkar till andra vyer värda av din app och statiska resursvägar för att veta var webbplatsen är värd utan att behöva ändra alla vyer efter installationen. Detta är en av de mer irriterande och tråkiga fallgroparna med att använda virtuella kataloger med IISNode.

versioner

Alla exemplen ovan fungerar med

  • Express v4.x
  • IIS 7.x / 8.x
  • Socket.io v1.3.x eller högre

Komma igång

IISNode tillåter Node.js webbappar att vara värd på IIS 7/8 precis som en .NET-applikation skulle göra. Naturligtvis kan du själv värd för din node.exe process i Windows men varför gör du det när du bara kan köra din app i IIS.

IISNode kommer att hantera skalning över flera kärnor, processhantering av node.exe och automatiskt återvinna din IIS-applikation när din app uppdateras, bara för att nämna några av dess fördelar .

Krav

IISNode har några krav innan du kan vara värd för din Node.js-app i IIS.

  1. Node.js måste installeras på IIS-värden, 32-bitars eller 64-bitars, antingen stöds.
  2. IISNode installerade x86 eller x64 , detta ska matcha biten hos din IIS-värd.
  3. Microsoft URL-omskrivningsmodul för IIS installerad på din IIS-värd.
    • Detta är nyckel, annars fungerar inte förfrågningar till din Node.js-app som förväntat.
  4. En Web.config i Web.config för din Node.js-app.
  5. IISNode-konfiguration via en iisnode.yml fil eller ett <iisnode> -element i din Web.config .

Grundläggande Hello World-exempel med Express

För att detta exempel ska fungera måste du skapa en IIS 7/8-app på din IIS-värd och lägga till katalogen som innehåller Node.js-webbapp som fysisk katalog. Se till att din Application / Application Pool Identity har åtkomst till Node.js-installationen. Det här exemplet använder Node.js 64-bitarsinstallation.

Projektstruktur

Detta är den grundläggande projektstrukturen för en IISNode / Node.js webbapp. Den ser nästan identisk ut med alla webbappar som inte är IISNode förutom tillägget av Web.config .

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

server.js - Expressapplikation

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}`);
});

Konfiguration & Web.config

Web.config är precis som alla andra IIS Web.config förutom att följande två saker måste vara närvarande, URL <rewrite><rules> och en IISNode <handler> . Båda dessa element är barn av <system.webServer> .

Konfiguration

Du kan konfigurera IISNode genom att använda en iisnode.yml fil eller genom att lägga till <iisnode> -elementet som ett barn till <system.webServer> i din Web.config . Båda dessa konfigurationer kan användas i samband med varandra, men i detta fall Web.config ange iisnode.yml filen OCH alla konfigurationskonflikter kommer att tas från iisnode.yml filen istället . Denna konfigurationsöverskridande kan inte ske tvärtom.

IISNode Handler

För att IIS ska veta att server.js innehåller vår Node.js webbapp måste vi uttryckligen berätta det. Vi kan göra detta genom att lägga till IISNode <handler> till elementet <handlers> .

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

Regler för URL-omskrivning

Den sista delen av konfigurationen är att se till att trafik avsedd för vår Node.js-app som kommer till vår IIS-instans riktas till IISNode. Utan URL-omskrivningsregler skulle vi behöva besöka vår app genom att gå till http://<host>/server.js och ännu värre, när du försöker begära en resurs från server.js får du en 404 . Det är därför URL-omskrivning är nödvändig för IISNode-webbappar.

<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>

Detta är en fungerande Web.config fil för detta exempel , installation för en 64-bitars Node.js-installation.


Det är det, besök nu din IIS-webbplats och se din Node.js-applikation fungera.

Med hjälp av en IIS Virtual Directory eller Nested Application via

Att använda en virtuell katalog eller en kapslad applikation i IIS är ett vanligt scenario och sannolikt ett som du vill utnyttja när du använder IISNode.

IISNode tillhandahåller inte direkt stöd för virtuella kataloger eller kapslade applikationer via konfiguration så för att uppnå detta måste vi dra fördel av en funktion i IISNode som inte är en del av konfigurationen och är mycket mindre känd. Alla barn i <appSettings> med Web.config läggs till i process.env objektet som egenskaper med appSetting-tangenten.

Låter skapa en virtuell katalog i <appSettings>

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

I vår Node.js-app kan vi komma virtualDirPath inställningen virtualDirPath

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

Nu <appSettings> vi kan använda <appSettings> för konfiguration, låter vi dra nytta av det och använda det i vår serverkod.

// 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');
});

Vi kan också använda virtualDirPath med våra statiska resurser

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

Kan sätta ihop allt detta

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}`);
});

Använda Socket.io med IISNode

För att få Socket.io att arbeta med IISNode, är de enda ändringar som krävs när du inte använder en Virtual Directory / Nested Application inom Web.config .

Eftersom Socket.io skickar förfrågningar som börjar med /socket.io , måste IISNode kommunicera till IIS att dessa också ska hanteras IISNode och inte bara är statiska filförfrågningar eller annan trafik. Detta kräver en annan <handler> än standard IISNode-appar.

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

Förutom ändringarna i <handlers> måste vi också lägga till en extra URL-omskrivningsregel. Omskrivningsregeln skickar all /socket.io till vår serverfil där Socket.io-servern körs.

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

Om du använder IIS 8 måste du inaktivera inställningen för webSockets i din Web.config förutom att lägga till ovanstående hanterare och skriva om reglerna. Detta är onödigt i IIS 7 eftersom det inte finns något webSocket-stöd.

<webSocket enabled="false" />



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow