简体   繁体   中英

Azure NodeJS Error: ENOENT, open 'D:\home\site\wwwroot\bin\views\'

I have been trying to deploy a Node application to Azure, but am running into a problem. I think that I know the source of the problem, but am not sure how to change the config to fix it.

For some reason, my node process is looking to use D:\home\site\wwwroot\bin as the path to look for script files and views instead of looking at D:\home\site\wwwroot.

I get the error: Error: ENOENT, open 'D:\home\site\wwwroot\bin\views\layouts\layout.hbs' on the stacktrace, which means that my app.js is being called, but it is looking in the wrong place for the views.

How do I tell azure to go up one more directory to look for the layouts instead of using bin as the default? Attached is the directory structure on my VM for the site.

/site

Mode                LastWriteTime     Length Name                              
----                -------------     ------ ----                              
d----          2/9/2015   6:27 PM            bin                               
d----          2/9/2015   6:27 PM            controllers                       
d----          2/9/2015   6:27 PM            models                            
d----          2/9/2015   6:27 PM            node_modules                      
d----          2/9/2015   6:27 PM            public                            
d----          2/9/2015   6:28 PM            tests                             
d----          2/9/2015   6:28 PM            views                             
-a---          2/9/2015   6:38 PM       2448 app.js                            
-a---          2/7/2015   1:17 AM        634 config.js                         
-a---          2/9/2015   6:25 PM     202392 hostingstart.html                 
-a---          2/7/2015   1:40 AM        597 package.json                      
-a---          2/5/2015   9:37 PM         22 README.md                         
-a---          2/7/2015   1:18 AM       1236 routes.js                         
-a---          2/7/2015   1:49 AM       1801 Web.config                        
-a---          2/5/2015   9:37 PM       1671 Web.Debug.config  

site/bin

Mode                LastWriteTime     Length Name                              
----                -------------     ------ ----                              
-a---        10/21/2014  11:29 PM        629 ChangeConfig.ps1                  
-a---        10/21/2014  11:29 PM       2141 download.ps1                      
-a---         1/10/2015  12:46 AM      24256 Microsoft.NodejsTools.WebRole.dll 
-a---        10/21/2014  11:29 PM         17 node.cmd                          
-a---        10/21/2014  11:29 PM       1819 setup_web.cmd                     
-a---          2/5/2015   9:37 PM        272 www        

www

#!/usr/bin/env node
var debug = require('debug')('ExpressApp3');
var app = require('../app');

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
    debug('Express server listening on port ' + server.address().port);
});

app.js

//...
var handlebars = require('express-handlebars').create(config.handlebars);
app.set('views', path.join(__dirname, 'views'));
app.engine('.hbs', handlebars.engine);
app.set('view engine', '.hbs');

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(require('stylus').middleware(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'public')));

web.config

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your Node.js application, please visit
  http://go.microsoft.com/fwlink/?LinkId=290972
  -->
<configuration>
  <appSettings>
    <!--
    <add key="StorageAccountName" value="" />
    <add key="StorageAccountKey" value="" />
    <add key="ServiceBusNamespace" value="" />
    <add key="ServiceBusIssuerName" value="" />
    <add key="ServiceBusIssuerSecretKey" value="" />
    -->
  </appSettings>
  <system.webServer>
    <!-- mimeMap enables IIS to serve particular file types as specified by fileExtension. -->
    <staticContent>
      <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
    </staticContent>

    <modules runAllManagedModulesForAllRequests="false" />

    <!-- Web.Debug.config adds attributes to this to enable remote debugging when publishing in Debug configuration. -->
    <iisnode watchedFiles="web.config;*.js;routes\*.js;views\*.jade"/>

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

    <security>
      <requestFiltering>
        <hiddenSegments>
          <remove segment="bin" />
        </hiddenSegments>
      </requestFiltering>
    </security>

    <rewrite>
      <rules>
        <clear />
        <rule name="app" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
          <match url="iisnode.+" negate="true" />
          <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
          <action type="Rewrite" url="bin\www" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

I just ran into this issue today as well. I'm new to node, so I'm not sure if this is the best approach but this worked for me.

I added this early in app.js

process.chdir(path.join(process.cwd(), '..'));

This is how I solved it.

I moved the www file in my project from /bin/www to the root directory. Changed in www:

var app = require('../app');

to

var app = require('./app');

Then changed my web.config to this:

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your Node.js application, please visit
  http://go.microsoft.com/fwlink/?LinkId=290972
  -->
<configuration>

  <appSettings>
    <!--
    <add key="StorageAccountName" value="" />
    <add key="StorageAccountKey" value="" />
    <add key="ServiceBusNamespace" value="" />
    <add key="ServiceBusIssuerName" value="" />
    <add key="ServiceBusIssuerSecretKey" value="" />
    -->
  </appSettings>
  <system.webServer>
    <!-- mimeMap enables IIS to serve particular file types as specified by fileExtension. -->
    <staticContent>
      <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
    </staticContent>

    <modules runAllManagedModulesForAllRequests="false" />

    <!-- Web.Debug.config adds attributes to this to enable remote debugging when publishing in Debug configuration. -->
    <iisnode watchedFiles="web.config;*.js;routes\*.js;views\*.hbs"/>

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

    <security>
      <requestFiltering>
        <hiddenSegments>
          <!--<remove segment="bin" />-->
        </hiddenSegments>
      </requestFiltering>
    </security>

    <rewrite>
      <rules>
        <clear />
        <rule name="app" enabled="true" patternSyntax="ECMAScript" stopProcessing="true">
          <match url="iisnode.+" negate="true" />
          <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
          <!--<action type="Rewrite" url="bin\www" />-->
        <action type="Rewrite" url="www" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

I just ran into this issue. I had to downgrade visual studio code from 1.66 to 1.64.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM