• 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():从暂停的状态中恢复
    
    
    
    
    
  • 相关阅读:
    NOIP200304麦森数
    NOIP201103瑞士轮
    NOIP200406合并果子
    Dijkstra堆优化与SPFA模板
    BZOJ1095: [ZJOI2007]Hide 捉迷藏
    NOIP201307货车运输
    hdu2062(递推)
    hdu1260(dp)
    hdu1158(dp)
    hdu1059(多重背包)
  • 原文地址:https://www.cnblogs.com/zhangjun516/p/3180339.html
Copyright © 2020-2023  润新知