How get the angular.js files on IIS 7.5 for angula

2020-04-19 08:27发布

问题:

--UPDATE

now Im getting this error but the rewrites looks like its working but it reads js files like html or some sort of issue like it

I want to create the right re-write rules for web.config on IIS 7.5 for angular full-stack application deploy

This is my WEB.CONFIG I'm Using this one but I cant config the the virtual path

<?xml version="1.0" encoding="utf-8"?>
<configuration>

<system.webServer>
    <handlers>
        <add name="iisnode" path="server.js" verb="*" modules="iisnode"/>
    </handlers>
    <iisnode node_env="PRODUCTION"
     nodeProcessCountPerApplication="1"
     maxConcurrentRequestsPerProcess="1024"
     maxNamedPipeConnectionRetry="100"
     namedPipeConnectionRetryDelay="250"
     maxNamedPipeConnectionPoolSize="512"
     maxNamedPipePooledConnectionAge="30000"
     asyncCompletionThreadCount="0"
     initialRequestBufferSize="4096"
     maxRequestBufferSize="65536"
     uncFileChangesPollingInterval="5000"
     gracefulShutdownTimeout="60000"
     loggingEnabled="true"
     logDirectory="iisnode"
     debuggingEnabled="true"
     debugHeaderEnabled="false"
     debuggerPortRange="5058-6058"
     debuggerPathSegment="debug"
     maxLogFileSizeInKB="128"
     maxTotalLogFileSizeInKB="1024"
     maxLogFiles="20"
     devErrorsEnabled="true"
     flushResponse="false"
     enableXFF="false"
     promoteServerVars=""
     configOverrides="iisnode.yml"
     watchedFiles="web.config;*.js" />
    <rewrite>
        <rules>
            <!-- Don't interfere with requests for node-inspector debugging -->
            <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
                <match url="^server.js\/debug[\/]?"/>
            </rule>

            <!-- serve static files from /public folder -->
            <rule name="StaticContent">
                <action type="Rewrite" url="public/{R:0}" logRewrittenUrl="true"/>
                <conditions>
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
                </conditions>
                <match url="public/*"/>
            </rule>

            <!-- All other URLs are mapped to the Node.js application entry point -->
            <rule name="DynamicContent">
                <conditions>
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
                </conditions>
                <action type="Rewrite" url="server.js"/>
            </rule>
            <rule name="SocketIO" patternSyntax="ECMAScript">
                <match url="socket.io.+"/>
                <action type="Rewrite" url="server.js"/>
            </rule>
        </rules>
    </rewrite>
    <!-- <appSettings>
        <add key="virtualDirPath" value="/idetikmssql"/>
    </appSettings> -->

</system.webServer>

THIS IS MY server.js

              "use strict";

              var express = require('express'),
                    stylus = require('stylus'),
                    logger = require('morgan'),
                    bodyParser = require('body-parser');
              // determind what mode we are
              var env = process.env.NODE_ENV = process.env.NODE_ENV||'developemnt';
              var virtualDirPath = process.env.virtualDirPath || '';
              var app = express();
              //configure the view engine
              function compile(str, path) {
                    return stylus(str).set('filename', path);
              }


              app.set('views', __dirname + '/server/views/');
              app.engine('html', require('ejs').renderFile);
              app.set('view engine', 'html');
              app.use(stylus.middleware(
                    {
                          src: __dirname + 'public',
                          compile: compile
                    }
              ));
              app.use(bodyParser());

              var appPath = app.get('appPath')
              app.use('/bower_components',  express.static(appPath + "/bower_components/"));
              app.use('/app/',              express.static(appPath + "/app/"));
              app.use('/assets',            express.static(appPath + "/assets/"));
              app.use(express.static(__dirname + '/public'));
              app.get('/partials/:partialsPath', function (req, res) {
                    debugger;
                    res.render('partials/' + req.params.partialsPath);
              });

              //the asterisk handles all routes includes javascript, css, html request...
              app.get('*', function (req , res) {
                    res.render('index');
              });
              // app.get(virtualDirPath + '/', function(req, res) {
              //   res.render('index', { virtualDirPath: virtualDirPath });
              // })

              var PORT = 3030;
              app.listen((process.env.PORT!==undefined)?process.env.PORT:PORT);
              console.log('Listening to PORT : ' + process.env.PORT );
              console.log(__dirname);

THIS IS MY INDEX.HTML

          <!doctype html>
          <!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
          <!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
          <!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
          <!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
            <head>
              <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"/>
            <!-- <base href="/"> -->
            <title></title>
            <meta name="description" content="">
            <meta name="viewport" content="width=device-width">
            </head>
            <body ng-app="idetikApp">
            <div ng-view=""></div>
            </body>
            <script type="text/javascript" src="app/app.js"></script>
            <script type="text/javascript" src="bower_components/angular/angular.js"></script>
            <script type="text/javascript" src="bower_components/angular-route/angular-route.js"></script>
            <script type="text/javascript" src="bower_components/angular-resource/angular-resource.js"></script>
          </html>

I add my file structure inside IIS

--ONE OF MY SOLUTIONS

I tried to install an express application from scratch and it works all I have to do is change the port number for process.env.PORT and its running but the full-stack still no able to make it work yet I still need help

HERE MY APP WORKS FINE ON IIS

回答1:

OK Folks after a week of digging it I finally made it work, the following its the right configuration for IIS 7.5 remember your /partials folder must be in the client /public folder for the express routing to work properly.

Here is a Link To the GIT-HUB PROJECT

link : https://github.com/cesarvega/MEAN-IIS7.5-Stack

Here its my web.config

          <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <system.webServer>
            <handlers>
                <add name="iisnode" path="server.js" verb="*" modules="iisnode"/>
            </handlers>
            <iisnode node_env="PRODUCTION"
             nodeProcessCountPerApplication="1"
             maxConcurrentRequestsPerProcess="1024"
             maxNamedPipeConnectionRetry="100"
             namedPipeConnectionRetryDelay="250"
             maxNamedPipeConnectionPoolSize="512"
             maxNamedPipePooledConnectionAge="30000"
             asyncCompletionThreadCount="0"
             initialRequestBufferSize="4096"
             maxRequestBufferSize="65536"
             uncFileChangesPollingInterval="5000"
             gracefulShutdownTimeout="60000"
             loggingEnabled="true"
             logDirectory="iisnode"
             debuggingEnabled="true"
             debugHeaderEnabled="false"
             debuggerPortRange="5058-6058"
             debuggerPathSegment="debug"
             maxLogFileSizeInKB="128"
             maxTotalLogFileSizeInKB="1024"
             maxLogFiles="20"
             devErrorsEnabled="true"
             flushResponse="false"
             enableXFF="false"
             promoteServerVars=""
             configOverrides="iisnode.yml"
             watchedFiles="web.config;*.js" />
            <rewrite>
                <rules>
                    <!-- Don't interfere with requests for node-inspector debugging -->
                    <rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
                        <match url="^server.js\/debug[\/]?"/>
                    </rule>
                    <!-- serve static files from /public folder -->
                    <rule name="StaticContent">
                        <action type="Rewrite" url="public/{R:0}" logRewrittenUrl="true"/>
                        <conditions>
                            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
                        </conditions>
                        <match url=".*" />
                    </rule>
                    <rule name="DynamicContent">
                        <conditions>
                            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
                        </conditions>
                        <action type="Rewrite" url="server.js"/>
                    </rule>
                    <rule name="SocketIO" patternSyntax="ECMAScript">
                        <match url="socket.io.+"/>
                        <action type="Rewrite" url="server.js"/>
                    </rule>
                </rules>
            </rewrite>
        </system.webServer>
    </configuration>

The Server.js file

        "use strict";
        var express = require('express'),
              stylus = require('stylus'),
              logger = require('morgan'),
              bodyParser = require('body-parser');
        var env = process.env.NODE_ENV = process.env.NODE_ENV||'developemnt';
        var app = express();
        //configure the view engine
        function compile(str, path) {
              return stylus(str).set('filename', path);
        }
        app.set('views', __dirname + '/server/views/');
        app.engine('html', require('ejs').renderFile);
        app.set('view engine', 'html');
        app.use(stylus.middleware(
              {
                    src: __dirname + 'public',
                    compile: compile
              }
        ));
        app.use(bodyParser());
        app.use(express.static(__dirname + '/public'));

        app.get('/partials/:partialsPath', function (req, res) {
              res.render('/node/idetikmssql/partials/' + req.params.partialsPath);
        });
        app.get('*', function (req , res) {
              res.render('index');
        });
        var PORT = 3030;
        app.listen((process.env.PORT!==undefined)?process.env.PORT:PORT);
        console.log('Listening to PORT : ' + process.env.PORT );
        console.log(__dirname);

The index.html

    <!doctype html>
<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
  <head>
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"/>
  <!-- <base href="/node/idetikmssql/"> -->
  <title></title>
  <meta name="description" content="">
  <meta name="viewport" content="width=device-width">
  </head>
  <body ng-app="idetikApp">
  <div ng-view=""></div>
  </body>
  <script type="text/javascript" src="bower_components/angular/angular.js"></script>
  <script type="text/javascript" src="bower_components/angular-route/angular-route.js"></script>
  <script type="text/javascript" src="bower_components/angular-resource/angular-resource.js"></script>
  <script type="text/javascript" src="app/app.js"></script>
</html>

The app.js inside public

    angular.module('idetikApp', [ 'ngResource', 'ngRoute']);

angular.module('idetikApp').config(function ($routeProvider, $locationProvider) {
  //$locationProvider.html5Mode(true);
  $routeProvider.when('/', {templateUrl: 'public/partials/main.html', controller:'mainctrl'})

});

angular.module('idetikApp').controller('mainctrl', function ($scope) {
  $scope.mayvar = "Hello from client Node JS "
})

YThe main.html

<h1>this is a partial</h1>
<h2>{{mayvar}}</h2>

and finally the file structure for the file paths and server IIS configuration

SERVER CONFIGURATION