node.js-3

来源:互联网 发布:数据库系统的发展 编辑:程序博客网 时间:2024/05/17 09:30

HTTP服务器和客户端

在之前写过一个app.js

var http=require('http');

http.createServer(function(req,res){
    res.writeHead(200,{'Content-Type':'text/html'});
    res.write('<h1>node.js</h1>');
    res.write('<p>hello node.js</p>');
}).listen(3000);
console.log("HTTP server is listening at port 3000.");

但我在浏览器中访问127.0.0.1:3000的时候一直不出来,只有在我关闭服务器的瞬间会冲出这个页面。这个bug今天解决了

问题处在res.write('<p>hello node.js</p>');。没有调用end函数,导致客户端处于永远等待状态

我在这之后没有通过res.end结束并发送导致的,将res.write('<p>hello node.js</p>');改写成res.end('<p>hello node.js</p>');即可后者在原来的
    res.write('<p>hello node.js</p>');之后加上一句res.end();


1.http.Server的事件

http.Server是一个基于事件的HTTP服务器,继承自EventEmitter提供的事件有

request:当客户端请求到来时,该事件被触发,提供req和res两个参数,分别是http.ServerRequest和http.ServerResponse的实例,表示请求和响应信息

connection:当tcp链接建立时该事件被触发,提供一个参数socket,为net.Socket的实例,粒度大于request,因为呵护段在Keep-Alive模式在可能会在同一链接内发送多次请求

close:当服务器关闭时,该事件被触发

//httpserver,js

var http=require('http');

var server= new http.Server();
server.on('request',function(req,res){
    res.writeHead(200,{'Content-Type':'text/html'});
    res.write('<h1>hello world</h1>');
    res.end('<p>node.js</p>');
});
server.listen(3000);
console.log('http server listen 3000');

2.http.ServerRequest

httpServerRequest是HTTP请求的信息,一般由http.Server的request事件发送,作为第一个参数传递通常简称request或req

提供三个事件用于控制请求体

data:当请求体数据到来时,事件被触发。该事件提供一个参数chunk,表示接受到的数据,如果该事件没有被监听,那么请求体将被抛弃,该事件可能会被调用多次

end:当请求体数据传输完成时,该事件被触发,此后不会再有数据来到。

close:用户请求结束时,该事件触发,。不同与end,如果用户强制终止了传输,还是会调用close


3获取get请求内容

//httpserverreq.js
var http=require('http');
var url=require('url');
var util=require('util');

http.createServer(function(req,res){
    res.writeHead(200,{'Content-Type':'text/html'});
    res.end(util.inspect(url.parse(req.url,true)));
}).listen(3000);

其中的inspect是将对象转换成字符才

parse用于解析url

输出的结果是

{ protocol: null,

slashes: null,

auth: null,

host: null,

port: null,

hostname: null,

hash: null,

search: '?name=zhoujixiang&email=332403170@qq.com',

query: { name: 'zhoujixiang', email: '332403170@qq.com' }, ---指的就是get请求的内容

pathname: '/user', -------指的是路径

path: '/user?name=zhoujixiang&email=332403170@qq.com',

href: '/user?name=zhoujixiang&email=332403170@qq.com' }


4.获取post请求内容


//httpserverreqpost.js
var http=require('http');
var querystring=require('querystring');
var util=require('util');

http.createServer(function(req,res){
    var post='';
    req.on('data',function(chunk){
    post+=chunk;
    });
    req.on('end',function(){
    post=querystring.parse(post);
    res.end(util.inspect(post));
    });
    console.log(post);
}).listen(3000);

定义一个post变量,用于在闭包中暂存请求体的信息


5.http.ServerResponse

http.ServerResponse是返回给客户端的信息,决定了用户最终能看到的结果,是由http.Server的request事件发送的,作为第二个参数传递,一般检测response或res

三个重要的成员函数 用于返回响应头、响应内容、结束请求

response.writeHead(statusCode,[headers]):向请求的客户断发送响应头,statusCode是HTTP的状态码。headers表示响应头的每个书信,该函数在一个请求内最多只能调用一次。如果不调用,则会自动生存一个响应头。

response.write(data,[encoding]):向请求客户端发送响应内容,data是一个Buffer火灾字符串,表示要发送的内容,如果是data是字符才还要指定encoding,默认是utf-8,在end函数之前调用,可被调用多次。

responde.end([data],[encoding]):结束响应,告知客户端所有发送已经完成,必须小于一次。参数与write方法含义相同。如果不调用该函数,客户端将永远处于等待状态