构建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');
构建web应用示例的更多相关文章
- Node.js高级编程读书笔记 - 4 构建Web应用程序
Outline 5 构建Web应用程序 5.1 构建和使用HTTP中间件 5.2 用Express.js创建Web应用程序 5.3 使用Socket.IO创建通用的实时Web应用程序 5 构建Web应 ...
- 高效构建Web应用 教你玩转Play框架 http://www.anool.net/?p=577
Play 框架是一个完整的Web应用开发框架,覆盖了Web应用开发的各个方面.Play 框架在设计的时候借鉴了流行的 Ruby on Rails 和 Grails 等框架,又有自己独有的优势.使用 P ...
- threejs构建web三维视图入门教程
本文是一篇简单的webGL+threejs构建web三维视图的入门教程,你可以了解到利用threejs创建简单的三维图形,并且控制图形运动.若有不足,欢迎指出. 本文使用的框架是three.js gi ...
- 实战案例--Grunt构建Web程序
GruntJS构建Web程序.使用Gruntjs来搭建一个前端项目,然后使用grunt合并,压缩JS文件,熟练了node.js安装和grunt.js安装后,接下来来实战一个案例,案例是根据snandy ...
- 使用Vert.x构建Web服务器和消息系统
如果你对Node.js感兴趣,Vert.x可能是你的下一个大事件:一个建立在JVM上一个类似的架构企业制度. 这一部分介绍Vert.x是通过两个动手的例子(基于Vert.x 2.0). 当Node.j ...
- 用 Python 构建 web 应用
用 Python 构建 web 应用 如果说仅仅要用 Python 构建 web 应用,可以将 socket 连接.HTTP 原始请求和响应格式等涉及网络基础的东西交给现成的库来实现,只需要专注于 w ...
- NodeJs+http+fs+request+cheerio 采集,保存数据,并在网页上展示(构建web服务器)
目的: 数据采集 写入本地文件备份 构建web服务器 将文件读取到网页中进行展示 目录结构: package.json文件中的内容与上一篇一样:NodeJs+Request+Cheerio 采集数据 ...
- 使用EXtjs6.2构建web项目
一.项目简介 众所周知ext是一款非常强大的表格控件,尤其是里边的grid为用户提供了非常多的功能,现在主流的还是用extjs4.0-4.2,但是更高一点的版本更加符合人的审美要求.因此,在今天咱们构 ...
- 《深入浅出Node.js》第8章 构建Web应用
@by Ruth92(转载请注明出处) 第8章 构建Web应用 一.基础功能 请求方法:GET.POST.HEAD.DELETE.PUT.CONNECT GET /path?foo=bar HTTP/ ...
随机推荐
- 用apache-cxf生成webservice客户端的时候报错Parameter: shead already exists for method
版本apache-cxf-3.1.0 命令如下:wsdl2java -p com.wz.interfaces -d ./src -client ./ws/xxx.wsdl 报错如下: WSDLToJa ...
- Kali Linux中MySQL重置root密码
参考:使用mysqladmin命令修改MySQL密码与忘记密码 前言:(在Windows的DOS命令行下和在kali Linux下修改方法是一样的)在kali Linux中默认安装了MySQL的最新版 ...
- RelativeLayout布局
RelativeLayout用到的一些重要的属性: 第一类:属性值为true或falseandroid:layout_centerHrizontal 水平居中android:layout_center ...
- Java并发包源码学习之AQS框架(三)LockSupport和interrupt
接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...
- 将Centos的yum源更换为阿里云源
阿里云Linux安装软件镜像源 阿里云是最近新出的一个镜像源.得益与阿里云的高速发展,这么大的需求,肯定会推出自己的镜像源.阿里云Linux安装镜像源地址:http://mirrors.aliyun. ...
- mysql 设置可以外部访问
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; --授权可以外部 ...
- 教你如何在Kali Linux 环境下设置蜜罐?
导读 Pentbox是一个包含了许多可以使渗透测试工作变得简单流程化的工具的安全套件.它是用Ruby编写并且面向GNU/Linux,同时也支持Windows.MacOS和其它任何安装有Ruby的系统. ...
- eclipse pydev 跳转
[windows]-[Preference]-[Pydev]-[Interpreter-Python]-[Libraries]-system PYTHONPATH 全部加一遍,先加父目录,再加子目录.
- VirtualBox CentOS安装增强功能与设置共享文件夹
如果安装的是CentOS minimal版无网络的可以看这篇文章. 一.安装依赖环境 依次执行如下命令 yum install update yum install kernel-headers yu ...
- Struts2 Action 动态传参数
Struts2的两个Action之间传参的问题. 需求功能是这样:Action1 获取数据库配置内容,得到相应Model的 动态URL ,这里的URL 有的是Action有的是JSP页面. 1.使用r ...