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');

构建web应用示例的更多相关文章

  1. Node.js高级编程读书笔记 - 4 构建Web应用程序

    Outline 5 构建Web应用程序 5.1 构建和使用HTTP中间件 5.2 用Express.js创建Web应用程序 5.3 使用Socket.IO创建通用的实时Web应用程序 5 构建Web应 ...

  2. 高效构建Web应用 教你玩转Play框架 http://www.anool.net/?p=577

    Play 框架是一个完整的Web应用开发框架,覆盖了Web应用开发的各个方面.Play 框架在设计的时候借鉴了流行的 Ruby on Rails 和 Grails 等框架,又有自己独有的优势.使用 P ...

  3. threejs构建web三维视图入门教程

    本文是一篇简单的webGL+threejs构建web三维视图的入门教程,你可以了解到利用threejs创建简单的三维图形,并且控制图形运动.若有不足,欢迎指出. 本文使用的框架是three.js gi ...

  4. 实战案例--Grunt构建Web程序

    GruntJS构建Web程序.使用Gruntjs来搭建一个前端项目,然后使用grunt合并,压缩JS文件,熟练了node.js安装和grunt.js安装后,接下来来实战一个案例,案例是根据snandy ...

  5. 使用Vert.x构建Web服务器和消息系统

    如果你对Node.js感兴趣,Vert.x可能是你的下一个大事件:一个建立在JVM上一个类似的架构企业制度. 这一部分介绍Vert.x是通过两个动手的例子(基于Vert.x 2.0). 当Node.j ...

  6. 用 Python 构建 web 应用

    用 Python 构建 web 应用 如果说仅仅要用 Python 构建 web 应用,可以将 socket 连接.HTTP 原始请求和响应格式等涉及网络基础的东西交给现成的库来实现,只需要专注于 w ...

  7. NodeJs+http+fs+request+cheerio 采集,保存数据,并在网页上展示(构建web服务器)

    目的: 数据采集 写入本地文件备份 构建web服务器 将文件读取到网页中进行展示 目录结构: package.json文件中的内容与上一篇一样:NodeJs+Request+Cheerio 采集数据 ...

  8. 使用EXtjs6.2构建web项目

    一.项目简介 众所周知ext是一款非常强大的表格控件,尤其是里边的grid为用户提供了非常多的功能,现在主流的还是用extjs4.0-4.2,但是更高一点的版本更加符合人的审美要求.因此,在今天咱们构 ...

  9. 《深入浅出Node.js》第8章 构建Web应用

    @by Ruth92(转载请注明出处) 第8章 构建Web应用 一.基础功能 请求方法:GET.POST.HEAD.DELETE.PUT.CONNECT GET /path?foo=bar HTTP/ ...

随机推荐

  1. oracle中的sql%rowcount,sql%found、sql%notfound、sql%rowcount和sql%isopen

     Oracle 存储过程 删除表记录时删除不存在的记录也是显示删除成功 create or replace procedure delDept(p_deptno in dept.deptno%type ...

  2. Express开发实例(1) —— Hello,world!

    Express是NodeJs开发中最常用的基础模块.NodeJs本身有Http模块,但是易用性并不好,因此有人在此基础上开发了Express模块. 什么是express express提供了丰富的路由 ...

  3. 清北学堂模拟day6 圆桌游戏

    [问题描述] 有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号.对1<i<n的i来说,i号的左边是i+1号,右边是i-1号.1号的右边是n号,n号的左边 ...

  4. Access应用笔记<三>

    在搭了一个数据库后,买了一本<让excel飞>,里面有提及access 经过研究之后,发现access+excel的结合确实能解决我的大部分难题,并且可以做得更好. 比较好的方法是, ac ...

  5. Javascript软键盘设计

    国内大多数网站的密码在网络传输过程中都是明文的,我们目前正在做的产品也是这样的情形,这正常吗? 大家都偷懒?不重视安全?各人持有观点,有人认为明文传输并不是想象中的那么可怕,事实上正常情况下这些报文你 ...

  6. 2013nanjignB

    B - Poor Warehouse Keeper Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  7. 滑雪 why WA

    滑雪 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 587  Solved: 219 Description 小明喜欢滑雪,因为滑雪的确很刺激,可是为了获 ...

  8. SQL中关于日期的常用方法

    mysql数据库: logintime >= STR_TO_DATE('$$START_TIME','%Y-%m-%d %H:%i:%s') AND logintime < STR_TO_ ...

  9. iOS开发——项目需求-快速回到当前界面的顶部

    利用UIWindow实现快速到达顶部 如下图,在状态栏添加一个没有颜色的UIWindow(里面添加一个按钮),实现点击这个按钮时能快速的回到当前界面的顶部 核心代码 一.利用UIWindow实现到达顶 ...

  10. ImageView显示网络图片

    package com.example.urlimage; import java.io.InputStream; import java.net.HttpURLConnection; import ...