在IISNode上运行的Azure Node.js应用程序中未定义端口

时间:2017-04-17 07:18:47

标签: node.js azure iis azure-web-sites iisnode

我有一个使用IISNode运行Node.js应用程序的Azure App Service。问题是process.env.PORT未定义。我已经读过IISNode使用名为命名管道的东西,并且端口信息可能不易读取(?),但在我的情况下我只是未定义。

我尝试部署的项目可以从GitHub找到。

我确实定义了一个Web.config文件,它看起来像这样:

    

    <handlers>
        <!-- indicates that the app.js file is a node.js application to be handled by the iisnode module -->
        <add name="iisnode" path="index.js" verb="*" modules="iisnode" />
    </handlers>

    <rewrite>
        <rules>
            <!-- Don't interfere with requests for node-inspector debugging -->
            <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
                <match url="^index.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">
                <match url="/*" />
                <action type="Rewrite" url="index.js" />
            </rule>
        </rules>
    </rewrite>

    <!-- You can control how Node is hosted within IIS using the following options -->
                <!--<iisnode      
                  node_env="%node_env%"
                  nodeProcessCountPerApplication="1"
                  maxConcurrentRequestsPerProcess="1024"
                  maxNamedPipeConnectionRetry="3"
                  namedPipeConnectionRetryDelay="2000"      
                  maxNamedPipeConnectionPoolSize="512"
                  maxNamedPipePooledConnectionAge="30000"
                  asyncCompletionThreadCount="0"
                  initialRequestBufferSize="4096"
                  maxRequestBufferSize="65536"
                  watchedFiles="*.js"
                  uncFileChangesPollingInterval="5000"      
                  gracefulShutdownTimeout="60000"
                  loggingEnabled="true"
                  logDirectoryNameSuffix="logs"
                  debuggingEnabled="true"
                  debuggerPortRange="5058-6058"
                  debuggerPathSegment="debug"
                  maxLogFileSizeInKB="128"
                  appendToExistingLog="false"
                  logFileFlushInterval="5000"
                  devErrorsEnabled="true"
                  flushResponse="false"      
                  enableXFF="false"
                  promoteServerVars=""
                 />-->
    <iisnode watchedFiles="*.js;node_modules\*;routes\*.js;views\*.jade;views\account\*.jade;iisnode.yml" />
</system.webServer>

我编写了一个Kudu脚本,用于构建资产并将其复制到%DEPLOYMENT_TARGET%。

我在这里失踪的是什么?任何帮助表示赞赏!

更新

我花了好几天时间来找出导致流程无法启动的原因,因此env变量未定义。我在15分钟内完成了在Heroku上运行的应用程序,所以我想这至少仍然是个谜(对我来说至少)。

2 个答案:

答案 0 :(得分:4)

“Starter Site”应用程序不会为我部署,看起来它的许多依赖项现在都被破坏了。话虽这么说,这是你需要开始使用Azure App Service的最小东西:

var http = require('http');

function onRequest(request, response) {
    response.writeHead(200, {
        'Content-type': 'text-plain'
    });
    response.write('Hello from Node.');
    response.end();
}

// provess.env.PORT will expand to the name pipe value on App Service
// request --> Frontends (ARR) --> Web Worker (IIS) --> iisnode --> 
//    --named-pipe--> node.exe server.js

http.createServer(onRequest).listen(process.env.PORT || 3000);
console.log('Listening for requests on port ' + (process.env.PORT || 3000));

您不必担心process.env.PORT返回的内容,它在运行时由平台处理,并保证返回正确的内容。

以下是事情的内幕:

App Service with NodeJS

Kudu (。scm site)→Process Explorer→node.exe→属性→环境变量:

Process Explorer

答案 1 :(得分:0)

对我来说,密钥使用的是端口1337,请尝试如下操作:

const http = require('http');

const server = http.createServer((request, response) => {
response.writeHead(200, {"Content-Type": "text/plain"});
response.end("Hello World!");
});

const port = process.env.PORT || 1337;
server.listen(port);

console.log("Server running at http://localhost:%d", port);

这是天蓝色示例的一部分 https://docs.microsoft.com/en-us/azure/app-service/quickstart-nodejs?pivots=platform-windows

我可以在process.env.PORT中使用此代码|| 1337年,将工作。但是如果我使用process.env.PORT || 3000它不起作用。

每个人都可以得出自己的结论