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 protected]

 63  output:

 64      {search:'?name=zj&[email protected]',

 65       query:{name:'zj',email:'[email protected]'},//GET请求的内容

 66       pathname:'/user',

 67       path:'/user?name=zj&[email protected]',

 68       href:'/user?name=zj&[email protected]'

 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:'[email protected]',

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():从暂停的状态中恢复

 

 
   

 

 
  

你可能感兴趣的:(node.js)