Node.js的核心模块主要有http、fs、url、querystring模块。下
面分别对这几个模块进行分析。fs模块将在第5章详细介绍。http模块
在第2章的例子中使用过,本节将详细分析其方法和原理。
4.3.1 http模块——创建HTTP服务器、客户端
使用http模块只需要在文件中通过require('http')引入即可。
http模块是Node.js原生模块中最为亮眼的模块。传统的HTPP服务器会
由Apache、Nginx、IIS之类的软件来担任,但是Node.js并不需要。
Node.js的http模块本身就可以构建服务器,而且性能非常可靠。
1.Node.js服务器端
下面创建一个简单的Node.js服务器。
【代码4-4】
【代码说明】
运行这段代码,在浏览器中打开http://localhost:3000/或者
http://127.0.0.1:3000/,页面中显示“Hello,Node.js!”文字。
http.createServer()方法返回的是http模块封装的一个基于事件
的http服务器。同样,http.re?uest是其封装的一个http客户端工
具,可以用来向http服务器发起请求。上面的re?和res分别是
http.IncomingMessage和 http.ServerResponse的实例。
http.Server的事件主要有:
re?uest:最常用的事件,当客户端请求到来时,该事件被触发,
提供re?和res两个参数,表示请求和响应信息。
connection:当TCP连接建立时,该事件被触发,提供一个socket
参数,是net.Socket的实例。
close:当服务器关闭时,触发事件(注意不是在用户断开连接
时)。
http.createServer()方法其实就是添?了一个re?uest事件监
听,利用下面的代码同样可以实现【代码4-4】的效果。
【代码4-5】
http.IncomingMessage是HTTP请求的信息,提供了以下3个事件:
data:当请求体数据到来时该事件被触发。该事件提供一个chunk
参数,表示接受的数据。
end:当请求体数据传输完毕时该事件被触发,此后不会再有数
据。
close:用户当前请求结束时,该事件被触发。
http.IncomingMessage提供的主要属性有:
method:HTTP请求的方法,如GET。
headers:HTTP请求头。
url:请求路径。
htt?Version:HTTP协议的版本。
将上面提到的知识融合到【代码4-4】的服务器代码中。
【代码4-6】
打开浏览器输入地址后,可以在浏览器页面中看到如图4.9所示的
信息。
http.ServerResponse是返回给客户端的信息,其常用的方法为:
res.?riteHead(statusCode,[heasers]):向请求的客户端发送响
应头。
res.?rite(data,[encoding]):向请求发送内容。
res.end([data],[encoding]):结束请求。
这些方法在上面的代码中已经演示过了,这里就不再演示了。
2.客户端向http服务器发起请求
以上方法都是http模块在服务器端的调用,接下来看客户端的调
用方式。向http服务器发起请求的方法有:
htt?.re?uest(o?tion[,callback]):o?tion为json对象,主要字
段有host、?ort(默认为80)、method(默认为GET)、?ath(请
求的相对于根的路径,默认为“?”)、headers等。该方法返回
一个htt?ClientRe?uest实例。
htt?.get(o?tion[,callback]):htt?.re?uest()调用HTTP请求方
式GET方法。
同时运行【代码4-4】【代码4-7】,我们可以发现命令行中输出
“Hello, Node.js!”字样,表明一个简单的GET请求发送成功了。
【代码4-7】
调用http.get()方法也可以实现同样的效果。
【代码4-8】
与服务端一样,http.request()和http.get()方法返回的是一个
http.ClientRequest()实例。http.ClientRequest()类主要的事件和
方法有:
response:当接收到响应时触发。
request.?rite(chunk[,encoding][,callback]) : 发 送 请 求 数
据。
res.end([data][,encoding][,callback]):发送请求完毕,应该
始终指定这个方法。
同样可以改写上述代码为【代码4-9】。
【代码4-9】
4.3.2 url模块——url地址处理
使用url模块,只需要在文件中通过require('url')引入即可。
url模块是一个分析、解析url的模块,主要提供以下三种方法:
url.parse(urlStr[,parseQueryString]
[,slashesDenoteHost]):解析一个url地址,返回一个url对象。
url.formate(urlObj):接受一个url对象为参数,返回一个完整
的url地址。
url.resolve(from, to):接受一个base url对象和一个href url
对象,像浏览器那样解析,返回一个完整地址。
【代码4-10】
在控制台中输出如图4.10所示的信息,说明解析成功。
调用url.format()方法返回上述完整地址的代码如下:
【代码4-11】
运行代码后,可以在控制台看到完整的url地址。
resolve的调用方式如下:
【代码4-12】
运 行 代 码 可 以 在 控 制 台 看 到 完 整 的 url 地 址
https://www.google.cn/image。
4.3.3 querystring模块——查询字符串处理
使 用 querystring 模 块 , 只 需 要 在 文 件 中 通 过
require('?uerystring')引入即可。querystring模块是一个处理查询
字符串的模块。这个模块的主要方法有:
querystring.parse():将查询字符串反序列化为一个对象,类似
JSON.?arse()。
querystring.stringify():将一个对象序列化为一个字符串,类
似JSON.stringify()。
下面演示调用它们的方式。
将查询字符串反序列化为一个对象。
【代码4-13】
将对象序列化为一个查询字符串。
【代码4-14】