zoukankan      html  css  js  c++  java
  • 构建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');

  • 相关阅读:
    润乾报表之图片导出不显示
    润乾报表之前言
    ActionSheet & alertView
    OC基础知识
    状态栏的设置
    计算机的存储单位
    autoreleass的基本使用
    图片选择器(UIImagePickerController)
    Foundation
    Block
  • 原文地址:https://www.cnblogs.com/SLchuck/p/4898896.html
Copyright © 2011-2022 走看看