Node.js app in Azure subfolder not running

1

We've tried everything with a colleague of mine, but we couldn't get it working :( We have a Web App in Azure - an MVC one. Inside of it we want to add a blog as a subfolder, but for now we test with a very simple express app.

Basically, we have the main MVC app. I've tried both moving my small test node.js app to site\test and site\wwwroot\test. There is a virtual application /test pointing to site/test. (from the Azure portal Application Settings).

Inside the test folder, web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <add name="iisnode" path="index.js" verb="*" modules="iisnode" />
        </handlers>
        <rewrite>
            <rules>
                <rule name="DynamicContent">
                    <action type="Rewrite" url="index.js" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

index.js

var express = require('express');
var app = express();

console.log(1);

app.get('/', function (req, res) {
  res.send('Hello World!');
});

app.listen(process.env.PORT || 3000, function () {
  console.log('Test is live');
});

package.json

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.14.0"
  }
}

After I try to open http://MySite.azurewebsites.net/test/ and then open the main site from FTP and go to LogFiles/DetailedErrors, there are two errors:

HTTP Error 500.1000 - Internal Server Error
Detailed Error Information:
Module     iisnode
Notification       ExecuteRequestHandler
Handler    iisnode
Error Code     0x8007000d
Requested URL      http://MySite:80/test/index.js
Physical Path      D:\home\site\wwwroot\test\index.js
Logon Method       Anonymous
Logon User     Anonymous

and

HTTP Error 403.14 - Forbidden
Detailed Error Information:
Module     DirectoryListingModule
Notification       ExecuteRequestHandler
Handler    StaticFile
Error Code     0x00000000
Requested URL      http://MySite:80/test/
Physical Path      D:\home\site\wwwroot\test\
Logon Method       Anonymous
Logon User     Anonymous

Finally, here's the main app web.config. I suspect it might hold the key to the problem:

<?xml version="1.0" encoding="utf-8"?>
<configuration>  
  <configSections>    
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <sectionGroup name="jsEngineSwitcher">
      <section name="core" type="JavaScriptEngineSwitcher.Core.Configuration.CoreConfiguration, JavaScriptEngineSwitcher.Core" />
      <section name="msie" type="JavaScriptEngineSwitcher.Msie.Configuration.MsieConfiguration, JavaScriptEngineSwitcher.Msie" />
      <section name="v8" type="JavaScriptEngineSwitcher.V8.Configuration.V8Configuration, JavaScriptEngineSwitcher.V8" />
    </sectionGroup>
  </configSections>  
  <connectionStrings>
    some conn strings
  </connectionStrings>    
  <location path="." inheritInChildApplications="false">
    <appSettings>
      <add key="webpages:Version" value="3.0.0.0" />
      <add key="webpages:Enabled" value="false" />
      <add key="ClientValidationEnabled" value="true" />
      <add key="UnobtrusiveJavaScriptEnabled" value="true" />      
      <add key="webpages:Enabled" value="true" />
      <add key="webpages:Version" value="3.0.0.0" />
    </appSettings>
  </location>
  <location path="." inheritInChildApplications="false">
    <system.web>      
      <authentication mode="None" />
      <compilation debug="true" targetFramework="4.5" />
      <httpRuntime targetFramework="4.5" />
      <httpHandlers>
        <add path="*.png" verb="*" type="System.Web.StaticFileHandler" validate="true" />
        <add path="*.js" verb="*" type="System.Web.StaticFileHandler" validate="true" />        
      </httpHandlers>      
    </system.web>
  </location>
  <location path="." inheritInChildApplications="false">
    <system.webServer>    
      <validation validateIntegratedModeConfiguration="false" />
      <modules runAllManagedModulesForAllRequests="true">
        <remove name="FormsAuthentication" />
      </modules>
      <staticContent>
        <remove fileExtension=".eot" />
        <remove fileExtension=".ttf" />
        <remove fileExtension=".otf" />
        <remove fileExtension=".woff" />
        <remove fileExtension=".woff2" />
        <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" />
        <mimeMap fileExtension=".ttf" mimeType="font/ttf" />
        <mimeMap fileExtension=".otf" mimeType="font/otf" />
        <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
        <mimeMap fileExtension=".woff2" mimeType="application/font-woff" />
        <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="14.00:00:00" />
      </staticContent>
      <security>
        <requestFiltering>
          <hiddenSegments>
            <add segment="ClearScript.V8" />
          </hiddenSegments>
        </requestFiltering>
      </security>
      <handlers>
        <remove name="Babel" />
        <add name="Babel" verb="GET" path="*.jsx" type="React.Web.BabelHandlerFactory, React.Web" preCondition="integratedMode" />
      </handlers>     
      <directoryBrowse enabled="false" />
    </system.webServer>
  </location>  
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <jsEngineSwitcher xmlns="http://tempuri.org/JavaScriptEngineSwitcher.Configuration.xsd">
    <core>
      <engines>
        <add name="MsieJsEngine" type="JavaScriptEngineSwitcher.Msie.MsieJsEngine, JavaScriptEngineSwitcher.Msie" />
        <add name="V8JsEngine" type="JavaScriptEngineSwitcher.V8.V8JsEngine, JavaScriptEngineSwitcher.V8" />
      </engines>
    </core>
  </jsEngineSwitcher>
</configuration>

We've tried everything we can find online and nothing is working :( Would really appreciate some help!

node.js
azure
asked on Stack Overflow Aug 17, 2016 by Miro

1 Answer

0

Here is an answer of IIS, Node.js, and Web Application with IISNode not configured right with Virtual Directory, which is in the same scenario with you. I tested this answer on locally, and it worked fine.

I built an empty MVC application, and put a simple expressjs application into it with the web.config similar with http://tstrimple.com/express-4-azure-websites/.

And I didn't config any location tag in the MVC's web.config file.

Any further concern, please feel free to let me know.

answered on Stack Overflow Aug 19, 2016 by Gary Liu - MSFT • edited May 23, 2017 by Community

User contributions licensed under CC BY-SA 3.0