Не удается получить express.js, работающий с IISNode

Я установил IISNode на сервере и следовал руководству, чтобы запустить с ним простое приложение hello world node.js. Он работает нормально и внешне доступен через интернет. Тем не менее, когда я пытаюсь включить мое существующее приложение Express, создается впечатление, что узел / экспресс даже не существует.

Это мой файл web.config:

<configuration>
<system.webServer>

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

</system.webServer>
</configuration>

Это находится в корневом каталоге приложения IIS вместе с app.js, который является моим основным файлом Express. Что интересно, если я зайду в localhost/TestApp/app.js, я вернусь:

Cannot GET /TestApp/app.js

Однако, если я попробую другой файл, например localhost/TestApp/public/htm/index.htm, я получу обратно файл, который там находится (в HTML, как и ожидалось). Кроме того, если я пытаюсь сделать серверный вызов (например, localhost/TestApp/GetUsernames).

Еще более интересно то, что если я испортил порт (например, app.listen(process.env.PORT2);), я получу это при попытке получить доступ к localhost/TestApp.js:

> iisnode encountered an error when processing the request.
> 
> HRESULT: 0x2 HTTP status: 500 HTTP reason: Internal Server Error

Если порт правильный (app.listen(process.env.PORT2);), я получаю Cannot GET /TestApp/app.js, поэтому похоже, что IISNode выполняет app.js (как иначе это может произойти сбой, когда я портить порт), но, похоже, ничего не работает.

Как я могу это исправить или хотя бы диагностировать проблемы?

Спасибо.

1 ответ

Вам, вероятно, нужно добавить <rewrite> раздел, чтобы уточнить, как маршрутизировать запросы:

<rewrite>
        <rules>
            <!-- Don't interfere with requests for node-inspector debugging -->
            <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
                <match url="^server.js\/debug[\/]?" />
            </rule>

            <!-- First we consider whether the incoming URL matches a physical file in the /public folder -->
            <rule name="StaticContent">
                <action type="Rewrite" url="public{REQUEST_URI}" />
            </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>

Извлечено из примера приложения Azure node.js.

Другие вопросы по тегам