构建web应用示例

1.1 请求方法的判断

var http = require('http');

var server = http.createServer(function(request,response){

      switch(request.method){

             case 'POST':

                    update(request,response);

                    break;

             case 'DELETE':

                    remove(request,response);

                    break;

             case 'PUT':

                    create(request,response);

                    break;

             case 'GET':

             default:

                    get(request,response);

      }

});

server.listen(8000,'127.0.0.1');

1.2 路径解析

var http = require('http');

var url = require('url');

var server = http.createServer(function(request,response){

      var pathname = url.parse(request.url).pathname;

      var paths = pathname.split('/');

      var controler = paths[1] || 'index';

      var action = paths[2] || 'action';

      var args = paths.slice(3);

      if(handles[controler]&&handles[controler][action]){

             handles[controler][action].apply(null,[request,response].concat(args));

      }else{

             response.writeHead(500);

             response.end('error');

      }

});

server.listen(8000,'127.0.0.1');

var handles = {};

handles.index = {};

handles.index.index = function(request,response){

      response.writeHead(200);

      response.end('success');

}

1.3 查询字符串

var http = require('http');

var url = require('url');

var server = http.createServer(function(request,response){

      request.query = url.parse(request.url,true).query;

      handle(request,response);

});

server.listen(8000,'127.0.0.1');

 

var handle = function(request,response){

     

}

1.4 Cookie

var parseCookie = function(cookie){

      var cookies = {};

      if(!cookie){

             return cookies;

      }

      var list = cookie.split(';');

      for(var i=0;i<list.length;i++){

             var pair = list[i].split('=');

             cookies[pair[0].trim()] = pair[1];

      }

      return cookies;

}

 

var serializeCookie = function(name,value,options){

      var pairs = [name+'='+encodeURI(value)];

      options = options || {};

     

      if(options.maxAge){

             pairs.push('Max-Age='+options.maxAge);

      }

      if(options.domain){

             pairs.push('Domain='+options.domain);

      }

      if(options.path){

             pairs.push('Path='+options.path);

      }

      if(options.expires){

             pairs.push('Expires='+options.expires.toUTCString());

      }

      if(options.httpOnly){

             pairs.push('HttpOnly');

      }

      if(options.secure){

             pairs.push('Secure');

      }

     

      return pairs.join('; ');

}

 

var http = require('http');

var url = require('url');

var server = http.createServer(function(request,response){

      request.cookies = parseCookie(request.headers.cookie);

      handle(request,response);

});

server.listen(8000,'127.0.0.1');

 

var handle = function(request,response){

      console.log(request.cookies);

}

1.5 Session

var sessions = {};

var key = 'session_id';

var EXPIRES = 20*60*1000;

 

var generate = function(){

      var session = {};

      session.id = (new Date()).getTime()+Math.random();

      session.cookie = {

             expire:(new Date()).getTime()+EXPIRES

      }

      sessions[session.id] = session;

      return session;

}

 

var http = require('http');

var url = require('url');

 

Function.prototype.before = function(beforefn){

      var _self = this;

      return function(){

             beforefn.apply(this,arguments);

             return _self.apply(this,arguments);

      }

}

 

var server = http.createServer(function(request,response){

      request.cookies = parseCookie(request.headers.cookie);

      var id = request.cookies[key];

      if(!id){

             request.session = generate();

      }else{

             var session = sessions[id];

             if(session){

                    if(session.cookie.expire > (new Date()).getTime()){

                           session.cookie.expire = (new Date()).getTime()+EXPIRES;

                           request.session = session;

                    }else{

                           delete sessions[id];

                           request.session = generate();

                    }

             }else{

                    request.session = generate();

             }

      }

      response.writeHead.before(function(){

             var cookies = response.getHeader('Set-Cookie');

             var session = serializeCookie(key,request.session.id);

             cookies = Array.isArray(cookies)?cookies.concat(session):[cookies,session];

             response.setHeader('Set-Cookie',cookies);

      });

      handle(request,response);

});

server.listen(8000,'127.0.0.1');

 

var handle = function(request,response){

      console.log(request.cookies);

      response.writeHead(200);

      response.end('ok');

}

1.6 数据上传

var http = require('http');

var url = require('url');

var querystring = require('querystring');

var xml2js= require('xml2js');

var formidable= require('formidable');

var hasBody = function(request){

      return 'transfer-encoding' in request.headers || 'content-length' in request.headers;

}

var mime = function(request){

      var str = request.headers['content-type'] || '';

      return str;

}

var server = http.createServer(function(request,response){

      if(hasBody(request)){

             var buffers = [];

             request.on('data',function(chunk){

                    buffers.push(chunk);

             });

             request.on('end',function(){

                    request.rawBody = Buffer.concat(buffers).toString();

                    handle(request,response);

             });

      }

      else{

             handle(request,response);

      }

});

server.listen(8000,'127.0.0.1');

 

var handle = function(request,response){

      //表单

      if(mime(request) == 'application/x-www-form-urlencoded'){

             request.body = querystring.parse(request.rawBody);

             handle(request,response);

      }else if(mime(request) == 'application/json'){

             request.body = JSON.parse(request.rawBody);

             handle(request,response);

      }else if(mime(request) == 'application/xml'){

             xml2js.parseString(request.rawBody,function(err,xml){

                    request.body = xml;

                    handle(request,response);

             });

      }else if(mime(request) == 'multipart/form-data'){

             var form = new formidable.IncomingForm();

             form.parse(request,function(err,fields,files){

                    request.body = fields;

                    request.files = files;

                    handle(request,response);

             });

      }else{

             console.log('ok');

      }

}

1.7 路由解析

var pathRegexp = function(path){

      var keys = [];

      path = path.concat(strict ?'':'/?')

                    .replace('/\/\(\g','(?:/')

                    .replace('/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?(\*)?/g',function(_,slash,format,key,capture,optional,star){

                           keys.push(key);

                           slash = slash || '';

                           return ''

                           +(optional?'':slash)

                           +'(?:'

                           +(optional?slash:'')

                           +(format||'')+(capture || (format && '([^/.]+?)' || '([^/+?])')) +')'

                           +(optional || '')

                           +(star?'(/*)?':'');

                    })

                    .replace('/([\/.])/g','\\$1')

                    .replace('/\*/g','(.*)');

                   

      return {

             keys:keys,

             regexp: new RegExp('^'+path+'$')

      };

}

 

var routes = {'all':[]};

var app={};

app.use = function(path){

      var handle;

      if(typeof path === 'string'){

             handle = {

                    path:pathRegexp(path),

                    stack:Array.prototype.slice.call(arguments,1)

             }

      }else{

             handle = {

                    path:pathRegexp('/'),

                    stack:Array.prototype.slice.call(arguments,0)

             }

      }

      routes.all.push(handle);

}

 

['get','put','delete','post'].forEach(function(method){

      routes[method] = [];

      app[method] = function(path){

             var handle = {

                    path:pathRegexp(path),

                    stack:Array.prototype.slice.call(arguments,1)

             }

             routes[method].push(handle);

      }

});

 

var querystring = function(request,response,next){

      try {

             request.query = url.parse(request.url,true).query;

             next();

      } catch (err) {

             next(err);

      }    

}

 

var cookie = function(request,response,next){

      var cookie = request.headers.cookie;

      var cookies = {};

      if(cookie){

             var list = cookie.split(';');

             for(var i=0;i<list.length;i++){

                    var pair = list[i].split('=');

                    cookies[pair[0].trim()] = pair[1];

             }

      }

     

      request.cookies = cookies;

     

      next();

}

 

var match = function(pathname,routes){

      var stacks = [];

      for(var i=0;i<routes.length;i++){

             var route = routes[i];

             var reg = route.path.regexp;

             var matched = reg.exec(pathname);

             if(matched){

                    stacks = stacks.concat(route.stack);

             }

      }

     

      return stacks;

}

 

var handle404 = function(request,response){

      console.log(404)

}

 

var handle500 = function(err,request,response,stacks){

      console.log(500)

}

 

var handle = function(request,response,stacks){

      var next = function(err){

             if(err){

                    return handle500(err,request,response,stacks)

             }

            

             var middleware = stacks.shift();

             if(middleware){

                    try {

                           middleware(request,response,next);

                    } catch (err) {

                           next(err);

                    }

             }

      }

     

      next();

}

 

var server = http.createServer(function(request,response){

      var pathname = url.parse(request.url).pathname;

      var method = request.method.toLowerCase();

     

      var stacks = match(pathname,routes.all);

      if(routes.hasOwnPerperty(method)){

             stacks.concat(match(pathname,routes[method]));

      }

     

      if(stacks.length){

             handle(request,response,stacks);

      }else{

             handle404(request,response)

      }

});

server.listen(8000,'127.0.0.1');

posted @ 2015-10-21 19:53  S&L·chuck  阅读(312)  评论(0编辑  收藏  举报