Search This Blog

2015-12-21

Node JS debugging

Node Inspector is a debugger interface for Node.js applications.

Install the Node Inspector by the following command.
$ npm install -g node-inspector

Debug your application by the following command.The node-debug command will load Node Inspector in your default browser.
node-debug index.js

Use the debugger; in your code , to watch the values/debug , when you call node js app from HTML based client App.

2015-12-19

Install NodeJS without Admin Right

1)Download nodejs from below location and extract to some local folder
http://nodejs.org/dist/latest/

2)Download npm from the below location and extract to some local folder
https://github.com/npm/npm/releases

3)Set PATH Variable either by below command or from Environment variable setting in your computer, when you have access
set PATH=%PATH%;C:\NODE_LOC\;C:\NPM_LOC


4)Set up NPM when its behind proxy
npm config set proxy http://proxy:port
npm config set https-proxy https://proxy:port
or with credential
npm config set proxy http://username:password@proxy:port
npm config set https-proxy https://username:password@proxy:port


5)Test by the below command
>node -v
>npm -v
--------------------------------------------------------------------------------------------------------------
Check the current setting by following comment :
npm config ls -l

Remove the Proxy set as above step 4 :
npm config rm proxy npm config rm https-proxy

Some strange issues can be resolved by the following commands :
npm cache clean

2015-12-17

Mongodb Overview

Installation :

Download Mongodb from below location

https://www.mongodb.org/downloads#production

Custom installation, in order to set a simple installation location like C:\Manab\MongoDB

Set the Environment Variable(PATH) as below

C:\Manab\MongoDB\Server\3.0\bin

Run :

mongod.exe --dbpath C:\Manab\MongoDB\data

Open another command prompt and navigate to the below location

C:\>cd C:\Manab\MongoDB\Server\3.0\bin

and type mongo.exe

Useful commands :

>show dbs : To check all the dbs exist in your mongodb server

>db.hostInfo() : To get the host information

>db.stats() :-To get stats about mongodb server type

>use fastcuredb :-To create database,It will not display in 'show dbs' list, until have any document

>db :-To check your currently selected database

>db.delete.insert({"name":"Manab Sample DB"}) / db.delete.insert({"name":"Arpana Basu","location":"UK"})

>show collections :-To see all the collections in the db

>db.createCollection("delete2") :-To create a new collection

>db.createCollection("delete3", { capped : true, autoIndexID : true, size : 6142800, max : 10000 } ) :-Create collection with parameter, can be seen by 'db.delete3.stats()'

>db.COLLECTION_NAME.find() /db.COLLECTION_NAME.find().pretty():-To query data either non formatted or formatted way(pretty), i.e db.delete.find()

>db.delete.find({"name":"Arpana Basu"}) /db.delete.find({"name":/Arpana/})/ db.delete.find({"name":/.*Arpana.*/,"location":"UK"}) /db.delete.find().limit(1)/db.delete.find().limit(1).skip(1)/db.delete.find().limit(1).sort({"name":-1})

>db.delete.update({"name":"Arpana Basu"},{$set:{"name":"Arpana B","location":"England"}})

>db.delete.remove({"name":"Arpana B"}) /db.delete.remove({"name":"Arpana B"},1)/ db.delete.remove()

>db.delete.ensureIndex({"name":1,"location":-1})
-db.delete.update({"name":"Arpana Basu"},{$set:{"age":30}})
-db.delete.update({"name":"Manab Sample DB"},{$set:{"location":"UK","age":34}})

>db.delete.aggregate([{$group : {_id : "$location", people : {$sum : 1}}}])--Sum of people group by Country
db.delete.aggregate([{$group : {_id : "$location", people : {$avg : 1}}}])--avg of people group by Country

>db.COLLECTION_NAME.drop() :- To delete collection i.e db.delete3.drop()

>db.dropDatabase :-to drop a existing database

>db.help()

Additional DB level commands :

        db.adminCommand(nameOrDocument) - switches to 'admin' db, and runs command [ just calls db.runCommand(...) ]
        db.auth(username, password)
        db.cloneDatabase(fromhost)
        db.commandHelp(name) returns the help for the command
        db.copyDatabase(fromdb, todb, fromhost)
        db.createCollection(name, { size : ..., capped : ..., max : ... } )
        db.createUser(userDocument)
        db.currentOp() displays currently executing operations in the db
        db.dropDatabase()
        db.eval() - deprecated
        db.fsyncLock() flush data to disk and lock server for backups
        db.fsyncUnlock() unlocks server following a db.fsyncLock()
        db.getCollection(cname) same as db['cname'] or db.cname
        db.getCollectionInfos()
        db.getCollectionNames()
        db.getLastError() - just returns the err msg string
        db.getLastErrorObj() - return full status object
        db.getLogComponents()
        db.getMongo() get the server connection object
        db.getMongo().setSlaveOk() allow queries on a replication slave server
        db.getName()
        db.getPrevError()
        db.getProfilingLevel() - deprecated
        db.getProfilingStatus() - returns if profiling is on and slow threshold
        db.getReplicationInfo()
        db.getSiblingDB(name) get the db at the same server as this one
        db.getWriteConcern() - returns the write concern used for any operations on this db, inherited from server object if set
        db.hostInfo() get details about the server's host
        db.isMaster() check replica primary status
        db.killOp(opid) kills the current operation in the db
        db.listCommands() lists all the db commands
        db.loadServerScripts() loads all the scripts in db.system.js
        db.logout()
        db.printCollectionStats()
        db.printReplicationInfo()
        db.printShardingStatus()
        db.printSlaveReplicationInfo()
        db.dropUser(username)
        db.repairDatabase()
        db.resetError()
        db.runCommand(cmdObj) run a database command.  if cmdObj is a string, turns it into { cmdObj : 1 }
        db.serverStatus()
        db.setLogLevel(level,)
        db.setProfilingLevel(level,) 0=off 1=slow 2=all
        db.setWriteConcern( ) - sets the write concern for writes to the db
        db.unsetWriteConcern( ) - unsets the write concern for writes to the db
        db.setVerboseShell(flag) display extra information in shell output
        db.shutdownServer()
        db.stats()
        db.version() current version of the server

Additional Collection Level Commands :

        db.test.find().help() - show DBCursor help
        db.test.count()
        db.test.copyTo(newColl) - duplicates collection by copying all documents to newColl; no indexes are copied.
        db.test.convertToCapped(maxBytes) - calls {convertToCapped:'test', size:maxBytes}} command
        db.test.dataSize()
        db.test.distinct( key ) - e.g. db.test.distinct( 'x' )
        db.test.drop() drop the collection
        db.test.dropIndex(index) - e.g. db.test.dropIndex( "indexName" ) or db.test.dropIndex( { "indexKey" : 1 } )
        db.test.dropIndexes()
        db.test.ensureIndex(keypattern[,options])
        db.test.explain().help() - show explain help
        db.test.reIndex()
        db.test.find([query],[fields]) - query is an optional query filter. fields is optional set of fields to return.
                                                      e.g. db.test.find( {x:77} , {name:1, x:1} )
        db.test.find(...).count()
        db.test.find(...).limit(n)
        db.test.find(...).skip(n)
        db.test.find(...).sort(...)
        db.test.findOne([query])
        db.test.findAndModify( { update : ... , remove : bool [, query: {}, sort: {}, 'new': false] } )
        db.test.getDB() get DB object associated with collection
        db.test.getPlanCache() get query plan cache associated with collection
        db.test.getIndexes()
        db.test.group( { key : ..., initial: ..., reduce : ...[, cond: ...] } )
        db.test.insert(obj)
        db.test.mapReduce( mapFunction , reduceFunction , )
        db.test.aggregate( [pipeline], ) - performs an aggregation on a collection; returns a cursor
        db.test.remove(query)
        db.test.renameCollection( newName , ) renames the collection.
        db.test.runCommand( name , ) runs a db command with the given name where the first param is the collection name
        db.test.save(obj)
        db.test.stats({scale: N, indexDetails: true/false, indexDetailsKey: , indexDetailsName: })
        db.test.storageSize() - includes free space allocated to this collection
        db.test.totalIndexSize() - size in bytes of all the indexes
        db.test.totalSize() - storage allocated for all data and indexes
        db.test.update(query, object[, upsert_bool, multi_bool]) - instead of two flags, you can pass an object with fields: upsert, multi
        db.test.validate( ) - SLOW
        db.test.getShardVersion() - only for use with sharding
        db.test.getShardDistribution() - prints statistics about data distribution in the cluster
        db.test.getSplitKeysForChunks( ) - calculates split points over all chunks and returns splitter function
        db.test.getWriteConcern() - returns the write concern used for any operations on this collection, inherited from server/db if set
        db.test.setWriteConcern( ) - sets the write concern for writes to the collection
        db.test.unsetWriteConcern( ) - unsets the write concern for writes to the collection

Mongodb Datatype :
MongoDB supports many datatypes whose list is given below:

String : This is most commonly used datatype to store the data. String in mongodb must be UTF-8 valid.
Integer : This type is used to store a numerical value. Integer can be 32 bit or 64 bit depending upon your server.
Boolean : This type is used to store a boolean (true/ false) value.
Double : This type is used to store floating point values.
Min/ Max keys : This type is used to compare a value against the lowest and highest BSON elements.
Arrays : This type is used to store arrays or list or multiple values into one key.
Timestamp : ctimestamp. This can be handy for recording when a document has been modified or added.
Object : This datatype is used for embedded documents.
Null : This type is used to store a Null value.
Symbol : This datatype is used identically to a string however, it's generally reserved for languages that use a specific symbol type.
Date  : This datatype is used to store the current date or time in UNIX time format. You can specify your own date time by creating object of Date and passing day, month, year into it.
Object ID : This datatype is used to store the document’s ID.
Binary data : This datatype is used to store binay data.
Code : This datatype is used to store javascript code into document.
Regular expression : This datatype is used to store regular expression

2015-12-05

Node JS Streams

A stream is an abstract interface implemented by various objects in Node.js. For example a request to an HTTP server is a stream. Streams are readable, writable, or both. All streams are instances of EventEmitter

You can load the Stream base classes by doing require('stream'). There are base classes provided for Readable streams, Writable streams, Duplex streams(both readable and writable), and Transform streams(Transform streams are Duplex streams where the output is in some way computed from the input).

Each type of Stream is an EventEmitter instance and throws several events at different instance of times. For example, some of the commonly used events are:
  • data - This event is fired when there is data is available to read.
  • end - This event is fired when there is no more data to read.
  • error - This event is fired when there is any error receiving or writing data.
  • finish - This event is fired when all data has been flushed to underlying system
Example:

Step 1: Run "npm init"

Step 2 : Insert all required parameter in 'npm init' and create the start page 'index.js'.

Step 3: index.js will be as below

var fs = require("fs");
var data = '';


// Create a readable stream
var readerStream = fs.createReadStream('myinputfile.txt');

// Set the encoding to be utf8.
readerStream.setEncoding('UTF8');

// Handle stream events --> data, end, and error
readerStream.on('data', function(chunk) {//The data event is fired when there is data is available to read.
   console.log('data event from Read Stream');
   data += chunk;
});

readerStream.on('end',function(){//The end event is fired when there is no more data to read.

   console.log('end event from Read Stream: ' + data);
});

readerStream.on('finish',function(){//The finish event is fired when all data has been flushed to underlying system
   console.log('finish event from Read Stream: ' +data);
});

readerStream.on('error', function(err){//The Error event is fired when there is any error receiving or writing data.
   console.log(err.stack);
});

console.log("Program Ended for Read Stream");
///////---------------------------------Write Stream--------------------------------------
console.log(data);
data = 'Simply Easy Learning';

// Create a writable stream
var writerStream = fs.createWriteStream('output.txt');

// Write the data to stream with encoding to be utf8
writerStream.write(data,'UTF8');

// Mark the end of file
writerStream.end();

// Handle stream events --> finish, and error
writerStream.on('finish', function() {
    console.log("Write completed from write Stream.");
});

writerStream.on('error', function(err){
   console.log(err.stack);
});

console.log("Program Ended for write stream");

Step 4: Create a new file 'myinputfile.txt' within the root folder with the text  'Hi, This is Manab'

Step 5:Run the application by 'node index.js'

Step 6: You could see a new file 'output.txt' has been generated within the root and below is the output in command prompt

Node JS File System

Node File System (fs) module can be imported using following syntax:
var fs = require("fs")
Every method in fs module have synchronous as well as asynchronous form. Asynchronous methods takes a last parameter
as completion function callback and first parameter of the callback function is error. It is preferred to use
asynchronous method instead of synchronous method as former never block the program execution where as the second one
does.
-----------------------------------------------------
fs.open(path, flags[, mode], callback):To open a file in asynchronous mode
var fs = require("fs");
// Asynchronous - Opening File
console.log("Going to open file!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
  console.log("File opened successfully!");    
});
Modes-3 main modes(r-read,w-write,a-append.when suffix is s, it indicates synchonousmode,when + ,it indicates both
operation)
-----------------------------------------------------
fs.read(fd, buffer, offset, length, position, callback):To read the file
var fs = require("fs");
var buf = new Buffer(1024);
console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("Going to read the file");
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }
      console.log(bytes + " bytes read");
     
      // Print only read bytes to avoid junk.
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }
   });
});
-----------------------------------------------------
fs.writeFile(filename, data[, options], callback):This method will over-write the file if file already exists.
var fs = require("fs");
console.log("Going to write into existing file");
fs.writeFile('input.txt', 'Simply Easy Learning!',  function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("Data written successfully!");
   console.log("Let's read newly written data");
   fs.readFile('input.txt', function (err, data) {
      if (err) {
         return console.error(err);
      }
      console.log("Asynchronous read: " + data.toString());
   });
});
-----------------------------------------------------
fs.close(fd, callback):To close an opened file
var fs = require("fs");
var buf = new Buffer(1024);
console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("Going to read the file");
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }
      // Print only read bytes to avoid junk.
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }
      // Close the opened file.
      fs.close(fd, function(err){
         if (err){
            console.log(err);
         }
         console.log("File closed successfully.");
      });
   });
});

------------------------------------------------------
fs.stat(path, callback):To get the information about a file
var fs = require("fs");
console.log("Going to get file info!");
fs.stat('input.txt', function (err, stats) {
   if (err) {
       return console.error(err);
   }
   console.log(stats);
   console.log("Got file info successfully!");
  
   // Check file type
   console.log("isFile ? " + stats.isFile());
   console.log("isDirectory ? " + stats.isDirectory());   
});
-------------------------------------------------------
fs.unlink(path, callback): To delete a file
var fs = require("fs");
console.log("Going to delete an existing file");
fs.unlink('input.txt', function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("File deleted successfully!");
});
-------------------------------------------------------
fs.ftruncate(fd, len, callback) : To truncate an opened file
var fs = require("fs");
var buf = new Buffer(1024);
console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("Going to truncate the file after 10 bytes");
  
   // Truncate the opened file.
   fs.ftruncate(fd, 10, function(err){
      if (err){
         console.log(err);
      }
      console.log("File truncated successfully.");
      console.log("Going to read the same file");
      fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
         if (err){
            console.log(err);
         }
         // Print only read bytes to avoid junk.
         if(bytes > 0){
            console.log(buf.slice(0, bytes).toString());
         }
         // Close the opened file.
         fs.close(fd, function(err){
            if (err){
               console.log(err);
            }
            console.log("File closed successfully.");
         });
      });
   });
});
-------------------------------------------------------
fs.mkdir(path[, mode], callback): To create a directory
var fs = require("fs");
console.log("Going to create directory /tmp/test");
fs.mkdir('/tmp/test',function(err){
   if (err) {
       return console.error(err);
   }
   console.log("Directory created successfully!");
});
-------------------------------------------------------
fs.rmdir(path, callback) : To remove a directory
var fs = require("fs");
console.log("Going to delete directory /tmp/test");
fs.rmdir("/tmp/test",function(err){
   if (err) {
       return console.error(err);
   }
   console.log("Going to read directory /tmp");
   fs.readdir("/tmp/",function(err, files){
      if (err) {
          return console.error(err);
      }
      files.forEach( function (file){
          console.log( file );
      });
   });
});
-------------------------------------------------------
fs.readdir(path, callback) : To read a directory
var fs = require("fs");
console.log("Going to read directory /tmp");
fs.readdir("/tmp/",function(err, files){
   if (err) {
       return console.error(err);
   }
   files.forEach( function (file){
       console.log( file );
   });
});

Express

Express is a minimal and flexible Node.js web application framework that provides a robust set of features to develop web and mobile applications. It allows to set up middlewares to respond to HTTP  Requests and defines a routing table which is used to perform different action based on HTTP Method and URL.It allows to dynamically render HTML Pages based on passing arguments to templates.


To Install Mean Stack run the following comment
  • npm install -g mean-cli
and make the initial structure of the project by following command
  • mean init yourNewApp
or, Run below command to install only the Express
  • npm install express --save                 
There are following important modules which you should install along with express:
  • body-parser - This is a node.js middleware for handling JSON, Raw, Text and URL encoded form data.
  • cookie-parser - Parse Cookie header and populate req.cookies with an object keyed by the cookie names.
  • multer - This is a node.js middleware for handling multipart/form-data.


  • $ npm install body-parser --save
  • $ npm install cookie-parser --save
  • $ npm install multer --save


Step 1: Run "npm init"

Step 2 : Insert all required parameter in 'npm init' and create the start page 'index.js'.

Step 3:Amend the package.json as below

{
  "name": "demoforexpress",
  "version": "1.0.0",
  "description": "Demo for Express",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "MRB",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.14.1",
    "cookie-parser": "^1.4.0",
    "express": "^4.13.3",
    "multer": "^1.1.0"
  }
}

Step 4: index.js will be as below

var express = require('express');
var app = express();
app.get('/', function (req, res) {
 console.log("Get method Called")
   res.send('Response from GET method');
})
// This responds a POST request for the homepage
app.post('/', function (req, res) {
   console.log("Post method called");
   res.send('Response from POST method');
})
// This responds a DELETE request for the /del_user page.
app.delete('/del_user', function (req, res) {
   console.log("delete method called for /del_user");
   res.send('Response from Delete Method');
})
// This responds a GET request for the /list_user page.
app.get('/list_user', function (req, res) {
   console.log("get Method called for /list_user");
   res.send('response from GET for /list_user');
})
// This responds a GET request for abcd, abxcd, ab123cd, and so on
app.get('/ab*cd', function(req, res) {  
   console.log("Got a GET request for /ab*cd");
   res.send('Response from Page Pattern Match');
})
var server = app.listen(8081, function () {
  var host = server.address().address
  var port = server.address().port
  console.log("Example app listening at http://%s:%s", host, port)
})




Step 5: Run the application by 'node index.js' , test in rest client and see the responses in console.

----------------------------More on Express-------------------------------------
package.json

{
  "name": "demoforexpress",
  "version": "1.0.0",
  "description": "Demo for Express",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "MRB",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.14.1",
    "cookie-parser": "^1.4.0",
    "express": "^4.13.3",
    "multer": "^1.1.0",
    "express-session":"*",
    "connect-busboy":"*",
    "path":"*",
    "fs-extra":"*",
    "formidable":"*"
  }
}

index.js

// fsutil file createnew index.js 2000
var express = require('express');
var app = express();
///-------------Basic Authentication-----------------------
var loginuser;
// Authenticator
app.use(function(req, res, next) {
    var auth;
   
    // check whether an autorization header was send   
    if (req.headers.authorization) {
      // only accepting basic auth, so:
      // * cut the starting "Basic " from the header
      // * decode the base64 encoded username:password
      // * split the string at the colon
      // -> should result in an array
      auth = new Buffer(req.headers.authorization.substring(6), 'base64').toString().split(':');
  
    }
    // checks if:
    // * auth array exists
    // * first value matches the expected user
    // * second value the expected password
    if ((!auth || auth[0] !== 'testuser' || auth[1] !== 'testpassword') && (!auth || auth[0] !== 'testuser2' || auth[1] !== 'testpassword2'))
    {
        // any of the tests failed
        // send an Basic Auth request (HTTP Code: 401 Unauthorized)
        res.statusCode = 401;
        // MyRealmName can be changed to anything, will be prompted to the user
        res.setHeader('WWW-Authenticate', 'Basic realm="MyRealmName"');
        // this will displayed in the browser when authorization is cancelled
        res.end('Unauthorized');
    } else {
        // continue with processing, user was authenticated
        loginuser=auth[0];
        next();
    }
    // if (!auth || auth[0] !== 'testuser' || auth[1] !== 'testpassword')
    // {
    //     // any of the tests failed
    //     // send an Basic Auth request (HTTP Code: 401 Unauthorized)
    //     res.statusCode = 401;
    //     // MyRealmName can be changed to anything, will be prompted to the user
    //     res.setHeader('WWW-Authenticate', 'Basic realm="MyRealmName"');
    //     // this will displayed in the browser when authorization is cancelled
    //     res.end('Unauthorized');
    // } else {
    //     // continue with processing, user was authenticated
    //     loginuser=auth[0];
    //     next();
    // }
});

////------------------------------End Authentication-------------------------------
app.get('/', function (req, res) {
 console.log("Get method Called")
   res.send('Response from GET method');
})
// This responds a POST request for the homepage
app.post('/', function (req, res) {
   console.log("Post method called");
   res.send('Response from POST method');
})
// This responds a DELETE request for the /del_user page.
app.delete('/del_user', function (req, res) {
   console.log("delete method called for /del_user");
   res.send('Response from Delete Method');
})
// This responds a GET request for the /list_user page.
app.get('/list_user', function (req, res) {
   console.log("get Method called for /list_user");
   res.send('response from GET for /list_user');
})
// This responds a GET request for abcd, abxcd, ab123cd, and so on
app.get('/ab*cd', function(req, res) {  
   console.log("Got a GET request for /ab*cd");
   res.send('Response from Page Pattern Match');
})
//------------------Cookie---------------------------
//This responds a GET request for cookie
var cookieParser = require('cookie-parser');
app.use(cookieParser());
app.get('/cookie', function (req, res) {
  //res.clearCookie("mycookie");
  res.cookie("mycookie","manab",{maxAge:864000000});
  res.setHeader('Content-Type', 'text/plain');
  res.send('Response from GET Cookie method ' +JSON.stringify(req.cookies));
})
//------------------Session---------------------------
//This responds a GET request for session
var session = require('express-session');
app.use(cookieParser());
app.use(session({ secret: 'loginuser', cookie: { maxAge: 60000 }}));
app.get('/session', function (req, res) {
var sess = req.session;
if (sess.views) {
    sess.views++
    res.setHeader('Content-Type', 'text/html')
    res.write('views: ' + sess.views + '
')
    res.write('expires in: ' + (sess.cookie.maxAge / 1000) + 's
')
    res.end()
  } else {
    sess.views = 1
    res.end('welcome to the session demo. refresh!')
  }
})
//------------------Uploading File---------------------------
//HTML For Uploading File
/*<!DOCTYPE html>
<html lang="en" ng-app="APP">
<head>
    <meta charset="UTF-8">
    <title>angular file upload</title>
</head>
<body>
        <form method='post' action='upload' enctype="multipart/form-data">
        <input type='file' name='fileUploaded'>
        <input type='submit'>
 </body>
</html>*/


var busboy = require('connect-busboy'); //middleware for form/file upload
var path = require('path');     //used for file path
var fs = require('fs-extra');       //File System - for file manipulation
app.use(busboy());
app.use(express.static(path.join(__dirname, 'public')));
//------------Without formidable--------
// app.route('/upload')
//     .post(function (req, res, next) {
//         var fstream;
//         req.pipe(req.busboy);
//         req.busboy.on('file', function (fieldname, file, filename) {
//             console.log("Uploading: " + filename);
//             //Path where image will be uploaded
//             fstream = fs.createWriteStream(__dirname + '/img/' + filename);
//             file.pipe(fstream);
//             fstream.on('close', function () {   
//                 console.log("Upload Finished of " + filename);             
//                 res.redirect('back');           //where to go next
//             });
//         });
//     });
//--------------------------------------
//------------------Uploading File With formidable
var bodyParser=require("body-parser");
var formidable = require("formidable");
app.use(bodyParser({defer: true}));
 app.route('/upload')
 .post(function (req, res, next) {
  var form = new formidable.IncomingForm();
    //Formidable uploads to operating systems tmp dir by default
    form.uploadDir = "./img";       //set upload directory
    form.keepExtensions = true;     //keep file extension
    form.parse(req, function(err, fields, files) {
        res.writeHead(200, {'content-type': 'text/plain'});
        res.write('received upload:\n\n');
        console.log("form.bytesReceived");
        //TESTING
        console.log("file size: "+JSON.stringify(files.fileUploaded.size));
        console.log("file path: "+JSON.stringify(files.fileUploaded.path));
        console.log("file name: "+JSON.stringify(files.fileUploaded.name));
        console.log("file type: "+JSON.stringify(files.fileUploaded.type));
        console.log("astModifiedDate: "+JSON.stringify(files.fileUploaded.lastModifiedDate));
        //Formidable changes the name of the uploaded file
        //Rename the file to its original name
        fs.rename(files.fileUploaded.path, './img/'+files.fileUploaded.name, function(err) {
        if (err)
            throw err;
          console.log('renamed complete'); 
        });
          res.end();
    });
});

//----------------------------------------------------
var server = app.listen(8081, function () {
  var host = server.address().address
  var port = server.address().port
  console.log("Example app listening at http://%d:%d", host, port)
})

Create server using HTTP,Express and HAPI

HTTP:
var http=require('http');
var handlerMethod=function(req,res){
 res.end("Hello, This is a message from the handler of web server of");
}
http.createServer(handlerMethod).listen(1234,'localhost');
console.log("Http Server is running");

Express:
var express = require('express');
var app = express();
app.get(*,function(req,res){
 res.end("response from server");
});
var server = app.listen(3000, function(){
    console.log('Listening on port %d', server.address().port);
});

Hapi:
var Hapi = require('hapi');
var server = new Hapi.Server(3000);//port number during initialize
server.start(function () {
    console.log('Server running at:', server.info.uri);
});

Difference between req.params,req.query and req.body :

(req.params) Checks route params, ex: /user/:id
(req.query) Checks query string params, ex: ?id=12 Checks urlencoded body params
(req.body), ex: id=12 To utilize urlencoded request bodies, req.body should be an object. This can be done by using the _express.bodyParser middleware.

Use Basic Authentication in the above example from Adv Rest Client:
URL-http://localhost:8081/
Header would be -Authorization: Basic dGVzdHVzZXI6dGVzdHBhc3N3b3Jk
To change the Authorization,Click on Form ->'Edit Value' for authorization header->Basic

Difference between res.end and res.send :
res.send('Response from POST method');-automatically assumes a Content-Type of html
res.end('Response from POST method');-so no assumptions are made for the Content-Type

Send cookie in response in the above example
use- cookie-parser to set and get cookie in request and response
call -http://localhost:8081/cookie to check also the request cookie which is firsttime set by response cookie


Output - Response from GET Cookie method {"_ga":"GA1.1.2097241217.1451846328","mycookie":"manab"}

Use Session Variable in the above example:
call http://localhost:8081/session from different type of browser , IE+Chrome
Delete Moudles which is can't be deleted for alonger file path name
npm install rimraf -g
rimraf node_modules

Upload file:
ref:http://stackoverflow.com/questions/23691194/node-express-file-upload
node index.js and open http://localhost:8081/index.html
Two example , first one is commented and without formidable , second one with formidable package