Szukaj…


Uwagi

Katalog wirtualny / zagnieżdżona aplikacja z pułapką wyświetleń

Jeśli zamierzasz używać Express do renderowania widoków za pomocą silnika widoków, musisz przekazać wartość virtualDirPath do swoich widoków

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

Powodem tego jest spowodowanie, aby hiperłącza do innych widoków były hostowane przez aplikację i statyczne ścieżki zasobów, aby wiedzieć, gdzie witryna jest hostowana, bez konieczności modyfikowania wszystkich widoków po wdrożeniu. Jest to jedna z bardziej irytujących i nużących pułapek korzystania z katalogów wirtualnych z IISNode.

Wersje

Wszystkie powyższe przykłady działają z

  • Express v4.x
  • IIS 7.x / 8.x
  • Socket.io v1.3.x lub nowszy

Pierwsze kroki

IISNode umożliwia hostowanie aplikacji sieci Web Node.js w IIS 7/8 tak, jak robiłaby to aplikacja .NET. Oczywiście możesz samodzielnie node.exe proces node.exe w systemie Windows, ale po co to robić, gdy możesz po prostu uruchomić aplikację w IIS.

IISNode zajmie skalowania na wiele rdzeni, proces manageement z node.exe i auto-recykling IIS Application gdy aplikacja jest aktualizowana, żeby wymienić tylko niektóre z jego zalet .

Wymagania

IISNode ma kilka wymagań przed hostowaniem aplikacji Node.js w IIS.

  1. Plik Node.js musi być zainstalowany na hoście IIS, obsługiwane są wersje 32-bitowa lub 64-bitowa.
  2. IISNode zainstalował x86 lub x64 , powinno to pasować do bitowości twojego hosta IIS.
  3. Moduł Microsoft URL-Rewrite dla IIS zainstalowany na twoim hoście IIS.
    • To klucz, w przeciwnym razie żądania do Twojej aplikacji Node.js nie będą działać zgodnie z oczekiwaniami.
  4. Web.config w folderze głównym aplikacji Node.js.
  5. Konfiguracja IISNode za pomocą pliku iisnode.yml lub elementu <iisnode> w Web.config .

Podstawowy przykład Hello World za pomocą Express

Aby ten przykład działał, musisz utworzyć aplikację IIS 7/8 na hoście IIS i dodać katalog zawierający aplikację sieci Web Node.js jako katalog fizyczny. Upewnij się, że twoja tożsamość aplikacji / puli aplikacji może uzyskać dostęp do instalacji Node.js. W tym przykładzie użyto 64-bitowej instalacji Node.js.

Struktura projektu

Jest to podstawowa struktura projektu aplikacji sieci Web IISNode / Node.js. Wygląda prawie identycznie jak każda aplikacja sieciowa inna niż IISNode, z wyjątkiem dodania Web.config .

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

server.js - Aplikacja ekspresowa

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

Konfiguracja i Web.config

Web.config jest jak każdy inny Web.config IIS, z wyjątkiem następujących dwóch rzeczy: URL <rewrite><rules> i IISNode <handler> moduł <handler> . Oba te elementy są elementami potomnymi elementu <system.webServer> .

Konfiguracja

Możesz skonfigurować IISNode przy użyciu pliku iisnode.yml lub dodając element <iisnode> jako element podrzędny <system.webServer> w Web.config . Obie te konfiguracje mogą być używane w połączeniu ze sobą, jednak w tym przypadku Web.config będzie musiał określić plik iisnode.yml ORAZ wszelkie konflikty konfiguracji zostaną iisnode.yml pliku iisnode.yml . Zastąpienie konfiguracji nie może nastąpić na odwrót.

Moduł obsługi IISNode

Aby IIS wiedział, że server.js zawiera naszą aplikację internetową Node.js, musimy to wyraźnie powiedzieć. Możemy to zrobić poprzez dodanie IISNode <handler> do <handlers> elementu.

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

Reguły przepisywania adresów URL

Ostatnią częścią konfiguracji jest zapewnienie, że ruch przeznaczony dla naszej aplikacji Node.js wchodzącej do naszego wystąpienia IIS jest kierowany do IISNode. Bez reguł przepisywania adresów URL musielibyśmy odwiedzić naszą aplikację, przechodząc do http://<host>/server.js a nawet gorzej, gdy próbujesz poprosić o zasób dostarczony przez server.js , otrzymasz 404 . Dlatego przepisywanie adresów URL jest konieczne w aplikacjach internetowych IISNode.

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

To jest działający plik Web.config dla tego przykładu , skonfigurowany do instalacji 64-bitowej wersji Node.js.


To wszystko, teraz odwiedź swoją witrynę IIS i zobacz, jak działa aplikacja Node.js.

Korzystanie z katalogu wirtualnego IIS lub aplikacji zagnieżdżonej za pośrednictwem

Korzystanie z katalogu wirtualnego lub aplikacji zagnieżdżonej w usługach IIS jest częstym scenariuszem i najprawdopodobniej z niego skorzystasz podczas korzystania z IISNode.

IISNode nie zapewnia bezpośredniego wsparcia dla katalogów wirtualnych lub aplikacji zagnieżdżonych poprzez konfigurację, więc aby to osiągnąć, musimy skorzystać z funkcji IISNode, która nie jest częścią konfiguracji i jest znacznie mniej znana. Wszystkie elementy <appSettings> elementu <appSettings> z Web.config są dodawane do obiektu process.env jako właściwości za pomocą klucza appSetting.

Utwórzmy katalog wirtualny w naszym <appSettings>

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

W naszej aplikacji Node.js możemy uzyskać dostęp do ustawienia virtualDirPath

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

Teraz, gdy możemy użyć elementu <appSettings> do konfiguracji, skorzystajmy z tego i użyjmy go w kodzie naszego serwera.

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

Możemy używać virtualDirPath również z naszymi statycznymi zasobami

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

Połączmy to wszystko razem

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

Używanie Socket.io z IISNode

Aby Socket.io działał z IISNode, jedyne zmiany niezbędne, gdy nie używa się katalogu wirtualnego / aplikacji zagnieżdżonej, znajdują się w Web.config .

Ponieważ Socket.io wysyła żądania zaczynające się od /socket.io , IISNode musi komunikować się z IIS, że powinny one również być obsługiwane przez IISNode i nie są to tylko statyczne żądania plików lub inny ruch. Wymaga to innego <handler> modułu <handler> niż standardowe aplikacje IISNode.

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

Oprócz zmian w <handlers> musimy również dodać dodatkową regułę przepisywania adresów URL. Reguła przepisywania wysyła cały ruch /socket.io do naszego pliku serwera, na którym działa serwer Socket.io.

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

Jeśli używasz IIS 8, musisz dodać ustawienie webSockets w Web.config oprócz dodania powyższej procedury obsługi i przepisywania. Jest to niepotrzebne w IIS 7, ponieważ nie ma obsługi webSocket.

<webSocket enabled="false" />



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow