1

我已经在服务器上设置了 IISNode,并按照指南获取了一个简单的 hello world node.js 应用程序运行它。它工作正常,并且可以通过互联网从外部访问。但是,当我尝试合并我现有的 express 应用程序时,就像 node/express 甚至不存在一样。

这是我的 web.config 文件:

<configuration>
<system.webServer>

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

</system.webServer>
</configuration>

那是 IIS 应用程序的根目录,以及我的主要 express 文件 app.js。有趣的是,如果我访问 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(当我弄乱了端口),但似乎没有任何效果。

我该如何解决这个问题,或者至少诊断问题?

谢谢你。

4

1 回答 1

3

您可能需要添加一个<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 应用中提取。

于 2013-12-06T23:50:29.683 回答