title: web server using nodejs for my angular app
body: <p>I am developing an angular app, i would like to run the app using web server using node.js as like angular-seed project <a href="https://github.com/angular/angular-seed" rel="nofollow noreferrer">https://github.com/angular/angular-seed</a>. I copied the angular seed app in my local path and i run it as below</p>
  
  <p>opened the command prompt</p>
  
  <p>I just run the following command <code>Node scripts\web-server.js</code> in command prompt, see screenshot</p>
  
  <p><img src="https://i.stack.imgur.com/UOSu1.png" alt="enter image description here"></p>
  
  <p>then i check in the browser app is working correctly</p>
  
  <p><img src="https://i.stack.imgur.com/RisS3.png" alt="enter image description here"></p>
  
  <p>Then i try to do the same for my test application, here what i did was, just created my own angular application and copied the web-server.js file into the scripts folder of my test application as shown in the screenshot below.</p>
  
  <p><img src="https://i.stack.imgur.com/hoyTi.png" alt="enter image description here">
  <img src="https://i.stack.imgur.com/KjnTO.png" alt="enter image description here"></p>
  
  <p>Then i do the following steps 
  opened the command prompt</p>
  
  <p>then I just run the following command <code>Node scripts\web-server.js</code> in command prompt, see screenshot</p>
  
  <p>but what i got was see the screen shot</p>
  
  <p><img src="https://i.stack.imgur.com/M10I0.png" alt="enter image description here"></p>
  
  <p>I would like to run my app as like angular-seed app in webserver using node.js.</p>
  
  <p>My <code>Index.html</code> is</p>
  
  <pre><code>&lt;!Doctype html&gt;
  &lt;html data-ng-app&gt;
  &lt;head&gt;
      &lt;meta charset="UTF-8"&gt;
      &lt;title&gt;angular JS directive demo&lt;/title&gt;
      &lt;script src="angular.js"&gt;&lt;/script&gt;
  &lt;/head&gt;
  &lt;body&gt;
      Name:
      &lt;input type="text" data-ng-model="name" /&gt; {{ name }}
      &lt;div class="container" data-ng-init="names=['aaa','bbb','ccc']"&gt;
          &lt;ul&gt;
              &lt;li ng-repeat="personName in names"&gt; {{ personName }}&lt;/li&gt;
          &lt;/ul&gt;
      &lt;/div&gt;
  
  &lt;/body&gt;
  &lt;/html&gt;
  </code></pre>
  
  <p><code>Web-server.js</code>. This file i copied from angular-seed project.</p>
  
  <pre><code>#!/usr/bin/env node
  
  var util = require('util'),
      http = require('http'),
      fs = require('fs'),
      url = require('url'),
      events = require('events');
  
  var DEFAULT_PORT = 8000;
  
  function main(argv) {
    new HttpServer({
      'GET': createServlet(StaticServlet),
      'HEAD': createServlet(StaticServlet)
    }).start(Number(argv[2]) || DEFAULT_PORT);
  }
  
  function escapeHtml(value) {
    return value.toString().
      replace('&lt;', '&amp;lt;').
      replace('&gt;', '&amp;gt;').
      replace('"', '&amp;quot;');
  }
  
  function createServlet(Class) {
    var servlet = new Class();
    return servlet.handleRequest.bind(servlet);
  }
  
  /**
   * An Http server implementation that uses a map of methods to decide
   * action routing.
   *
   * @param {Object} Map of method =&gt; Handler function
   */
  function HttpServer(handlers) {
    this.handlers = handlers;
    this.server = http.createServer(this.handleRequest_.bind(this));
  }
  
  HttpServer.prototype.start = function(port) {
    this.port = port;
    this.server.listen(port);
    util.puts('Http Server running at http://localhost:' + port + '/');
  };
  
  HttpServer.prototype.parseUrl_ = function(urlString) {
    var parsed = url.parse(urlString);
    parsed.pathname = url.resolve('/', parsed.pathname);
    return url.parse(url.format(parsed), true);
  };
  
  HttpServer.prototype.handleRequest_ = function(req, res) {
    var logEntry = req.method + ' ' + req.url;
    if (req.headers['user-agent']) {
      logEntry += ' ' + req.headers['user-agent'];
    }
    util.puts(logEntry);
    req.url = this.parseUrl_(req.url);
    var handler = this.handlers[req.method];
    if (!handler) {
      res.writeHead(501);
      res.end();
    } else {
      handler.call(this, req, res);
    }
  };
  
  /**
   * Handles static content.
   */
  function StaticServlet() {}
  
  StaticServlet.MimeMap = {
    'txt': 'text/plain',
    'html': 'text/html',
    'css': 'text/css',
    'xml': 'application/xml',
    'json': 'application/json',
    'js': 'application/javascript',
    'jpg': 'image/jpeg',
    'jpeg': 'image/jpeg',
    'gif': 'image/gif',
    'png': 'image/png',
    'svg': 'image/svg+xml'
  };
  
  StaticServlet.prototype.handleRequest = function(req, res) {
    var self = this;
    var path = ('./' + req.url.pathname).replace('//','/').replace(/%(..)/g, function(match, hex){
      return String.fromCharCode(parseInt(hex, 16));
    });
    var parts = path.split('/');
    if (parts[parts.length-1].charAt(0) === '.')
      return self.sendForbidden_(req, res, path);
    fs.stat(path, function(err, stat) {
      if (err)
        return self.sendMissing_(req, res, path);
      if (stat.isDirectory())
        return self.sendDirectory_(req, res, path);
      return self.sendFile_(req, res, path);
    });
  }
  
  StaticServlet.prototype.sendError_ = function(req, res, error) {
    res.writeHead(500, {
        'Content-Type': 'text/html'
    });
    res.write('&lt;!doctype html&gt;\n');
    res.write('&lt;title&gt;Internal Server Error&lt;/title&gt;\n');
    res.write('&lt;h1&gt;Internal Server Error&lt;/h1&gt;');
    res.write('&lt;pre&gt;' + escapeHtml(util.inspect(error)) + '&lt;/pre&gt;');
    util.puts('500 Internal Server Error');
    util.puts(util.inspect(error));
  };
  
  StaticServlet.prototype.sendMissing_ = function(req, res, path) {
    path = path.substring(1);
    res.writeHead(404, {
        'Content-Type': 'text/html'
    });
    res.write('&lt;!doctype html&gt;\n');
    res.write('&lt;title&gt;404 Not Found&lt;/title&gt;\n');
    res.write('&lt;h1&gt;Not Found&lt;/h1&gt;');
    res.write(
      '&lt;p&gt;The requested URL ' +
      escapeHtml(path) +
      ' was not found on this server.&lt;/p&gt;'
    );
    res.end();
    util.puts('404 Not Found: ' + path);
  };
  
  StaticServlet.prototype.sendForbidden_ = function(req, res, path) {
    path = path.substring(1);
    res.writeHead(403, {
        'Content-Type': 'text/html'
    });
    res.write('&lt;!doctype html&gt;\n');
    res.write('&lt;title&gt;403 Forbidden&lt;/title&gt;\n');
    res.write('&lt;h1&gt;Forbidden&lt;/h1&gt;');
    res.write(
      '&lt;p&gt;You do not have permission to access ' +
      escapeHtml(path) + ' on this server.&lt;/p&gt;'
    );
    res.end();
    util.puts('403 Forbidden: ' + path);
  };
  
  StaticServlet.prototype.sendRedirect_ = function(req, res, redirectUrl) {
    res.writeHead(301, {
        'Content-Type': 'text/html',
        'Location': redirectUrl
    });
    res.write('&lt;!doctype html&gt;\n');
    res.write('&lt;title&gt;301 Moved Permanently&lt;/title&gt;\n');
    res.write('&lt;h1&gt;Moved Permanently&lt;/h1&gt;');
    res.write(
      '&lt;p&gt;The document has moved &lt;a href="' +
      redirectUrl +
      '"&gt;here&lt;/a&gt;.&lt;/p&gt;'
    );
    res.end();
    util.puts('301 Moved Permanently: ' + redirectUrl);
  };
  
  StaticServlet.prototype.sendFile_ = function(req, res, path) {
    var self = this;
    var file = fs.createReadStream(path);
    res.writeHead(200, {
      'Content-Type': StaticServlet.
        MimeMap[path.split('.').pop()] || 'text/plain'
    });
    if (req.method === 'HEAD') {
      res.end();
    } else {
      file.on('data', res.write.bind(res));
      file.on('close', function() {
        res.end();
      });
      file.on('error', function(error) {
        self.sendError_(req, res, error);
      });
    }
  };
  
  StaticServlet.prototype.sendDirectory_ = function(req, res, path) {
    var self = this;
    if (path.match(/[^\/]$/)) {
      req.url.pathname += '/';
      var redirectUrl = url.format(url.parse(url.format(req.url)));
      return self.sendRedirect_(req, res, redirectUrl);
    }
    fs.readdir(path, function(err, files) {
      if (err)
        return self.sendError_(req, res, error);
  
      if (!files.length)
        return self.writeDirectoryIndex_(req, res, path, []);
  
      var remaining = files.length;
      files.forEach(function(fileName, index) {
        fs.stat(path + '/' + fileName, function(err, stat) {
          if (err)
            return self.sendError_(req, res, err);
          if (stat.isDirectory()) {
            files[index] = fileName + '/';
          }
          if (!(--remaining))
            return self.writeDirectoryIndex_(req, res, path, files);
        });
      });
    });
  };
  
  StaticServlet.prototype.writeDirectoryIndex_ = function(req, res, path, files) {
    path = path.substring(1);
    res.writeHead(200, {
      'Content-Type': 'text/html'
    });
    if (req.method === 'HEAD') {
      res.end();
      return;
    }
    res.write('&lt;!doctype html&gt;\n');
    res.write('&lt;title&gt;' + escapeHtml(path) + '&lt;/title&gt;\n');
    res.write('&lt;style&gt;\n');
    res.write('  ol { list-style-type: none; font-size: 1.2em; }\n');
    res.write('&lt;/style&gt;\n');
    res.write('&lt;h1&gt;Directory: ' + escapeHtml(path) + '&lt;/h1&gt;');
    res.write('&lt;ol&gt;');
    files.forEach(function(fileName) {
      if (fileName.charAt(0) !== '.') {
        res.write('&lt;li&gt;&lt;a href="' +
          escapeHtml(fileName) + '"&gt;' +
          escapeHtml(fileName) + '&lt;/a&gt;&lt;/li&gt;');
      }
    });
    res.write('&lt;/ol&gt;');
    res.end();
  };
  
  // Must be last,
  main(process.argv);
  </code></pre>
  
  <p>Please help me in this. Thanks in advance for any help.</p>