更改为.ejs后,在Azure上路由中断

时间:2015-10-01 20:55:07

标签: javascript node.js azure angular-ui-router

更改我的文件扩展名和路由以指向重命名的.ejs文件后,我的应用程序在Azure上中断但在本地工作正常。

angularApp.js

var app = angular.module('theApp', ['ui.router']);

app.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
    $stateProvider.state('index', {
        url: '/index',
        templateUrl: '/templates/index.ejs',
        controller: 'MainCtrl'
    })
    .state('view', {
        url: '/view',
        templateUrl: '/templates/view.ejs',
        controller: 'ViewCtrl'
    })
    .state('quote', {
        url: '/quote',
        templateUrl: '/templates/quote.ejs',
        controller: 'QuoteCtrl'
    })
    ...

    $urlRouterProvider.otherwise('index');
}]);

的package.json

{
  "dependencies": {
    ...
    "debug": "~2.2.0",
    "ejs": "~2.3.3",
    "express": "~4.13.1",
    ...
  }
}

然后我得到的错误是

GET http://example.azurewebsites.net/templates/index.ejs 404 (Not Found)

但同样,它在当地运作良好。 Azure可能只有一些版本的“ejs”吗?

修改

在我的package.json(^ 1.0.0)中尝试使用旧版本的ejs也不起作用。

1 个答案:

答案 0 :(得分:0)

似乎如果Azure无法解析文件扩展名,默认情况下它将响应404代码,而ejs模板文件只能由节点服务器解析。

由于node.js应用程序在由web.config配置的Azure Web Apps上的iisnode上运行。

由于我的测试,我需要在web.config中配置处理程序映射以让iisnode处理所有文件,然后我可以直接在浏览器上访问该文件,同时应用程序运行良好。

您可以使用FTP工具或Kudu consolehttps://<your_site_name>.scm.azurewebsites.net/DebugConsole)来检查您的项目文件系统是否正确。如果您没有web.config,请添加一个。

为了便于测试,我将入口文件index.html和模板文件放在快速应用程序架构目录的公共文件夹中:

-|public/
    |javasripts/
        -angularApp.js
    |templates/
        -index.ejs
    -index.html 

web.config应该是:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>
  </appSettings>
  <system.webServer>
    <staticContent>
      <mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
    </staticContent>

    <modules runAllManagedModulesForAllRequests="false" />
    <iisnode watchedFiles="web.config;*.js;routes\*.js;views\*.jade"/>
    <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>