node.js fs,http
1 error: 2 EventEmitter定义了一个特殊的时间error,它包含了‘错误’的语义,当error被发射时,EventEmitter规定如果没有 3 响应的监听器,Node.js会把它当做异常,退出程序并打印调用栈,一般我们要为会发射error事件的对象设置监听器, 4 避免遇到错误后整个程序崩溃。 5 6 /* 7 *author:e路相扶 8 *filename error.js 9 */ 10 var events=require('events'); 11 var emitter=new events.EventEmitter(); 12 emitter.emit('error'); 13 14 大多数时候,我们不会直接使用EventEmitter,而是在对象中继承它,包括fs,net,http在内的只要是支持事件 15 响应的核心模块都是EventEmitter的子类 16 because: 17 1.具有某个实体功能的对象实现事件符合语义,时间的监听和发射应该是一个对象的方法 18 2.javascript的对象机制是基于原型的,支持部分多重继承,继承EventEmitter不会打乱对象原有的继承关系 19 20 file system :fs 21 fs模块时文件操作的封装,提供了对文件的读取,写入,更名,删除,遍历目录,链接等POSIX文件系统操作 22 23 fs.readFile(filename,[encoding],[callback(err,data)])异步读取文件 24 err表示错误,data解析后是字符串,否则以buffer形式表示二进制数据 25 /* 26 *author:e路相扶 27 *filename read.js 28 */ 29 var fs=requier('fs'); 30 fs.readFile('zj.txt','utf-8',function(err,data)){ 31 if(err){ 32 console.log(err); 33 }else{ 34 console.log(data); 35 } 36 }) 37 38 fs.readFileSync(filename,[encoding])同步读取try{..}catch(){..}捕捉异常 39 40 fs.open(path,flags,[mode],[callback(err,fd)]) 打开文件 41 flags:r,r+,w,w+,a,a+ 42 mode:指定文件权限 43 fs.read(fd,buffer,offset,length,position,[callback(err,bytesRead,buffer)]) POSIX read函数封装 44 offeset:是buffer的写入偏移量 45 length:文件中读取的字节数 46 position:文件读取的起始位置,如果为null,则从当前文件指针的位置读取 47 bytesRead:读取的字节数 48 buffer:缓冲区对象 49 50 /* 51 *author:e路相扶 52 *filename read2.js 53 */ 54 var fs=require('fs'); 55 fs.open('zj.txt',r,function(err,fd){ 56 if(err){ 57 console.error(err); 58 return; 59 } 60 var buf=new Buffer(8); 61 fs.read(fd,buf,0,8,null,function(err,bytesRead,buffer){ 62 if(err){ 63 console.error(err); 64 return; 65 } 66 console.log('bytesRead '+bytesRead); 67 console.log(buffer); 68 }); 69 }); 70
1 HTTP服务器和客户端 2 Node.js提供了http模块,其中封装了一个高效的HTTP服务器和一个简易的HTTP客户端 3 http.Server是一个基于事件的HTTP服务器,核心是由Node.js下层C++部分实现,接口是由Javascript封装。 4 http.request是HTTP客户端工具用于向HTTP服务器发送请求 5 6 HTTP服务器 7 8 /* 9 *author:e路相扶 10 *filename app.js 11 */ 12 var http=require('http'); 13 http.createServer(function(req,res){ 14 res.writeHead(200,{'Content-Type':'text/html'}); 15 res.write('<h1>Node.js</h1>'); 16 res.end('<p>Hello world</p>'); 17 }).listen(3000); 18 console.log('HTTP server is listening at port 3000'); 19 20 http.createServer创建http.Server实例,请求对象req,响应对象res,响应代码200表示请求成功。 21 22 http.Server提供了几个事件: 23 request:当客户请求到来时,该事件被触发,提供了两个参数req,res分别是http.ServerRequset, 24 http.ServerResponse 表示请求和响应信息 25 connection:当TCP连接建立,该事件被触发,提供了一个参数socket,为net.socket实例 26 connection事件的粒度要大于request,因为客户端在Keep-Alive模式下可能在同一个连接内发送多次请求 27 close:当服务器关闭时,事件被触发 28 29 /* 30 *author:e路相扶 31 *filename httpserver.js 32 */ 33 var server=new http.Server(); 34 server.on('request',function(req,res){ 35 res.writeHead(200,{'Content-Type':'text/html'}); 36 res.write('<h1>Node.js</h1>'); 37 res.end('<p>Hello world</p>'); 38 }).listen(3000); 39 40 http.ServerRequest是HTTP请求的信息,是后端开发者最关注的内容 41 42 HTTP请求一般分为:请求头(Request Header)请求体(Request Body) 43 http.ServerRequest提供了三个事件用于控制请求体传输 44 data:请求数据到来之后该事件被触发,事件提供了一个参数chunk,表示接收到的数据,如果该事件没有被监听 45 那么请求体将会被抛弃 (可能会被多次调用) 46 end:当请求体数据传输完成时,事件被触发,此后不再有数据到来 47 close:用户当前请求结束,该事件被触发,不同于end,用户强制终止传输,也还是调用close 48 49 获取GET请求内容 50 /* 51 *author:e路相扶 52 *filename httpserverrequestget.js 53 */ 54 var http=require('http'); 55 var url=require('url'); 56 var util=require('util'); 57 http.createServer(function(req,res){ 58 res.write(200,{'Content-Type':'text/plain'}); 59 res.end(util.inspect(url.parse(req.url,true))); 60 }).listen(3000); 61 62 访问http://127.0.0.1:3000/user?name=zj&email=zhangjun516@126.com 63 output: 64 {search:'?name=zj&email=zhangjun516@126.com', 65 query:{name:'zj',email:'zhangjun516@126.com'},//GET请求的内容 66 pathname:'/user', 67 path:'/user?name=zj&email=zhangjun516@126.com', 68 href:'/user?name=zj&email=zhangjun516@126.com' 69 } 70 71 72 获取Post请求内容 73 /* 74 *author:e路相扶 75 *filename httpserverrequestpost.js 76 */ 77 var http=require('http'); 78 var querystring=require('querystring'); 79 var util=require('util'); 80 81 http.createServer(function(req,res){ 82 var post=''; 83 req.on('data',function(chunk){ 84 post+=chunk; 85 }); 86 req.on('end',function(){ 87 post=querystring.parse(post); 88 res.end(util.inspect(post)); 89 }) 90 }).listen(3000); 91 92 这个仅仅是例子,真实情况中的要复杂 93 94 http.ServerResponse 返回给客户端的信息,决定了用户最终能看到的结果 95 response.writeHead(statusCode,[headers])向请求的客户端发送响应头 96 response.write(data,[encoding])向请求的客户端发送响应内容(在response.end之前,可以多次调用) 97 response.end([data],[encoding])响应结束,告知客户端所有的发送已经完成,如果不调用改函数,客户端将处于等待状态 98 99 HTTP客户端 100 http模块提供了两个函数http.request和http.get,功能是作为客户端向HTTP服务器发起请求。 101 http.request(option,callback) 发起HTTP请求,option=》关联数组 参数: 102 host:请求网站的域名或IP地址 103 port:请求网站的端口,默认80 104 method:请求方法,默认GET 105 path:请求的相对于根的路径 106 headers:一个关联数组对象,为请求头的内容 107 callback:传递一个参数,为http.ClientResponse实例 108 109 http.request返回一个http.ClientRequest的实例 110 111 /* 112 *author:e路相扶 113 *filename httprequest.js 114 */ 115 var http=require('http'); 116 var querystring=require('querystring'); 117 118 var contents=querystring.stringify({ 119 name:'zj', 120 email:'zhangjun516@126.com', 121 }); 122 var oprionts={ 123 host:127.0.0.1, 124 path:/var/www/post.php, 125 method:'POST', 126 headers:{ 127 'Content-Type':'application/x-www-form-urlencoded', 128 'Content-Length':'contents.length' 129 } 130 }; 131 var req=http.request(options,function(res){ 132 res.setEncoding('utf8'); 133 res.on('data',function(data){ 134 console.log(data); 135 }); 136 }); 137 req.write(contents); 138 req.end(); 139
1 Notice:不要忘记写req.end(),不然服务器接收不到信息 2 3 http.get(options,callback)是http.request的简化版,唯一的区别就是http.get自动将请求的方法设为Get请求 4 同时不需要调用req.end(); 5 6 /* 7 *author:e路相扶 8 *filename httpget.js 9 */ 10 var http=require('http'); 11 http.get({host:'127.0.0.1'},function(res){ 12 res.setEncoding('utf8'); 13 res.on('data',function(data){ 14 console.log(data); 15 }); 16 }); 17 18 http.ClientRequest 是由http.request或http.get返回产生的对象 表示一个已经产生而且正在进行中的HTTP请求 19 /* 20 *author:e路相扶 21 *filename httpresponse.js 22 */ 23 var http=require('http'); 24 var req=http.get({host:'127.0.0.1'}); 25 req.on('response',function(res){ 26 res.setEncoding('utf8'); 27 res.on('data',function(data){ 28 console.log(data); 29 }); 30 }); 31 http.ClientRequest 像http.ServerResponse一样提供了write和end函数,用于服务器发送请求体,通常用于post 32 put等操作,所有写操作结束以后必须调用end函数以通知服务器,否则请求无效。 33 34 request.abort():终止正在发送的请求 35 requset.setTimeout(timeout,[callback])设置请求超时时间,timetout(毫秒数) 36 37 and so on 38 39 http.ClientResponse 40 response.setEncoding([encoding]):设置默认的编码当data事件被触发时,数据将会以encoding编码, 41 默认值是null,记不编码,以buffer形式存储, 42 response.pause():暂停接收数据和发送事件,方便下载功能 43 response.resume():从暂停的状态中恢复