2015-09-11 2 views
1

У меня есть приложение AngularJS, построенное поверх Node.JS, которое размещено в Azure (IIS) и использует режим HTML5. В ситуациях, когда я не использовать Node.js и просто использовать AngularJS с IIS, я могу переписать URL, так что обновление страницы не вызывает ошибку 404 с помощью следующего правила в IIS Web.config:URL-адрес переопределения IIS в AngularJS с узлом для углового режима HTML5

<rule name="AngularJSHTML5Mode" stopProcessing="true"> 
     <match url=".*"/> 
     <conditions logicalGrouping="MatchAll"> 
     <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/> 
     <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/> 
     <add input="{REQUEST_URI}" pattern="^/(api)" negate="true"/> 
     </conditions> 
     <action type="Rewrite" url="/"/> 
</rule> 

Однако, используя Angular поверх Node.js (с ExpressJS), я получаю сообщение об ошибке «Невозможно GET/myroute» на странице обновления, даже с приведенным выше правилом в IIS. Есть ли что-то, что мне нужно настроить в Server.js или другое правило в Web.config.

Вот что я имею в Экспрессе на данный момент. Я использую Express 4:

// Initialize Express App 
var app = express(); 

var listener = app.listen(1337, function() { 
    console.log('Listening on port ' + listener.address().port); //Listening on port 1337 
}); 

app.use(express.static(__dirname + "/public")); 

Я понимаю, что страница обновляется не должно происходить в SPA, как показывает практика, но они делают, и мне нужно, чтобы учесть это.

+3

Нет, вы должны настроить его в узле.js. Когда запрос передается node.js, web.config ничего не делает. –

+0

У вас есть пример того, как это сделать? – Kode

+1

У меня нет, но обычно это просто простой app.get (промежуточное программное обеспечение, которое идет за вашими маршрутами и делает index.html вместо 404. –

ответ

2

Я экспериментировал, и это то, что работает для меня:

web.config (site.js точка входа в мое приложение узла)

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <httpErrors existingResponse="PassThrough" /> 

     <iisnode nodeProcessCommandLine="&quot;c:\program files\nodejs\node.exe&quot;" watchedFiles="*.js" 
     interceptor="&quot;%programfiles%\iisnode\interceptor.js&quot;" promoteServerVars="LOGON_USER"/> 
     <handlers> 
      <add name="iisnode" path="site.js" verb="*" modules="iisnode" /> 
     </handlers> 

     <rewrite> 
      <rules> 
       <clear /> 
       <rule name="default"> 
        <match url="/*" /> 
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false" /> 
        <action type="Rewrite" url="site.js" /> 
       </rule> 
      </rules> 
     </rewrite> 

     <security> 
      <requestFiltering> 
       <hiddenSegments> 
        <add segment="node_modules" /> 
       </hiddenSegments> 
      </requestFiltering> 
     </security> 
    </system.webServer> 
</configuration> 

статический файловый сервер в экспресс + url rewrite

app.use(express.static(clientDir)); 

// for SPA 
app.get('/*', function(req,res, next){ 
    res.format({ 
     html: function(){ 
      res.sendFile(path.join(clientDir, 'index.html')); 
     }, 
     json: function(){ 
      next(); 
     } 
    }); 
}); 

//routes... 

Я также попытался реализовать переписывание URL с помощью виртуального приложения в iis. Это не работает. Вместо этого мне пришлось настроить путь в моем модуле узла, чтобы удалить ведущую часть маршрута.

Однако у вас может быть iis serve the static files после того, как ваше приложение загрузилось.

+0

Я пробовал это, но это не сработало для меня. Я использую Express 4 и опубликует соответствующий код в моем исходном сообщении. – Kode

+1

@ Kode это абсолютно работает для меня. У меня есть пример здесь: https://github.com/futurechan/how-to-node/tree/master/leveraging-gulp Это не включает файл web.config, но я могу развернуть это на iis через iisnode и включить web.config выше, и он работает. –

+0

Спасибо, я просто получил его работу с помощью другого метода. – Kode

0

При дальнейшей копании мне не нужна настройка в Интернете. У меня это в моем server.js возбудить соединение с угловым индексным файлом:

var app = express(); 

app.use(express.static(__dirname + "/public")); 


var listener = app.listen(1337, function() { 
    console.log('Listening on port ' + listener.address().port); //Listening on port 1337 
}); 

Эта часть имеет решающее значение, в конце всех GetS, шесты и т.п. Я добавил это в качестве последней функции. Он должен быть последним, поскольку он является «пойманным», и если вы поместите его перед функцией GET или POST, он не увидит его как «Экспресс», а сломанный «Угловой маршрут», и если ваш App.js настроен правильно, (необязательно):

// Placed at end for routing non-Express calls/AngularJS refreshes 
app.use('/*', function (req, res) { 
    res.sendFile(__dirname + '/public/index.html'); 
}); 
+1

Это doesn Запросы на 'text/html' будут отправляться в статические файлы, если совпадение не найдено, вы обслуживаете index.html. Запросы для' application/json' может идти на маршруты независимо от порядка. –

 Смежные вопросы

  • Нет связанных вопросов^_^