Nodejs核心模块
主要内容
全局对象
常用工具
事件机制
文件系统访问
HTTP服务器与客户端
一、全局对象
js中有一个特殊对象,全局对象,它及其所有属性都可以在程序任何地方访问,即全局变量
js中的,全局对象是window,而node.js中的全局对象是global,所有全局变量(除了global本身以外)都是global对象的属性
1、全局对象和全局变量
- 满足以下条件的变量是全局变量
- 在最外层定义的变量
- 全局对象的属性
隐式定义的变量(未定义直接赋值的变量)
注意:永远使用var定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险
2、process
1)介绍
- process是一个全局变量,即global对象的属性
- 用于描述当前node.js进行状态的对象
- 提供一个与操作系统简单接口
2)常用成员方法:
- process.argv是命令行参数数组,第一个元素是node,第二个元素是脚本文件名,从第三个元素开始没个元素是一个运行参数
- process.stdout是标准输出流,通常我们使用的console.log()向标准输出打印字符,而process.stdout.write()函数提供了更底层的接口
- process.stdin是标准输入流,初始时它被暂停的,要想从标准输入读取数据,必须恢复流,并手动编写流的事件响应函数
3、console
用于提供控制台标准输出
二、常用工具util
util是一个node.js核心模块,提供常用函数的集合,用于弥补核心js的功能过于精简不足
1、util.inherits
util.inherits(constructor, superConstructor) 是一个实现对象间原型继承的函数
js的面向对象特性是基于原型的,与常见的基于类的不同
2、util.inspect
util.inspect(object, [showHidden],[depth],[colors]) 将任意对象转换为字符串的方法,通常用于调试和错误输出
3、测试工具:util.isArray()、util.isRegExp()、util.isDate()、util.isError()
三、事件驱动events
- events是node.js最重要的模块,没有之一,原因是node.js本身架构是事件式的,而它提供了唯一的接口
- 不仅用于用户代码与node.js下层事件循环的交互,被几乎所有模块依赖
1、事件发射器
- events模块只提供一个对象:events.EventEmitter
- EventEmitter 核心:事件发射与事件监听器功能的封装
- 事件发射时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递
EventEmitter常用的API:
EventEmitter.on(event, listener)
EventEmitter.emit(event, [arg1], [arg2], [...])
EventEmitter.once(event, listener)
EventEmitter.removeListener(event, listener)
EventEmitter.removeAllListeners([event])
2、error事件
- EventEmitter 定 了一个特 的事件 error,它包 了 错误 的语 义,我们在遇到 异常的时 通常会发射 error 事件。
- error 被发射时,EventEmitter 规定如果没有 应的 听器,Node.js 会 它 作异常, 出程序并打 调用 。
3、继承EventEmitter
大多数情况不会直接使用EventEmitter,而是在对象中继承它。包括fs、net、http在内,只有是支持事件响应的核心模块都是EventEmitter的子类
四、文件系统fs
- fs提供了文件操作封装,提供了文件的读取、写入、更名、删除、遍历目录、链接等posix文件系统操作
- 异步和同步操作
1、fs.readFile
- fs.readFile(filename,[encoding],[callback(err,data)])是最简 的读取 文件的函数。
- fs.readFileSync(filename, [encoding])是 fs.readFile 同步的版本
- fs.open(path, flags, [mode], [callback(err, fd)])是 POSIX open 函数的封装
- fs.read(fd, buffer, offset, length, position, [callback(err, bytesRead, buffer)])是 POSIX read 函数的 装
五、HTTP服务器与客户端
- node.js标准库提供了http模块,其中封装了一个高效http服务器和一个简易的http客户端
- http.Server是一个基于事件的HTTP服务器,它的核心由node.js下层c++部分实现,接口由js封装,兼顾了高性能与简易性
- http.request则是一个HTTP客户端工具,用于向HTTP服务器发起请求
1、HTTP服务器
var http = require('http');
http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<h1>Node.js</h1>');
res.end('<p>Hello World</p>');
}).listen(3000);
console.log("HTTP server is listening at port 3000.");
1)http.Server 的 事件
http.Server 是一个基于事件的 HTTP 服务器,所有的请求都被 装为 的事件, 开发者只需要对它的事件编写 应函数 可实现 HTTP 服务器的所有功能。
2)http.ServerRequest
- http.ServerRequest 是 HTTP 请求的
- 它一版 由http.Server 的 request 事件发 ,作为第一个参数传递,通常简 request 或 req
- HTTP 请求一 可以分为两部分: (Request Header)和 (Requset Body)。
- Request Header:内容短可以在请求头解析完成后立即读取。而请求体可能 相对长 , 需要一定的时间传输
2.1) 因此 http.ServerRequest 提供三个事件控制请求体传输
- data: 当请求体数据到来时,该事件触发
- end: 当请求体数据传输完成时,该事件被触发,此后不会再有数据到来
- close: 用户当前请求结束时,该事件被触发,不同于end,如果用户强制终止传输,也还是会调用close
3) 获取GET请求内容
- 由于GET请求直接被嵌入再路径中,url是完成的请求路径,包括了?后面的部分,因此手动解析后面内容作为get请求的参数
- Node.js 的 url 模块中的 parse 函数提供了这个功能
- 通过 url.parse1, 始的 path 被解析为一个对象,其中 query 就是我们所 的 GET 请求的内容,而路 则是 pathname
4) 获取POST请求内容
- 相比 GET 请求 所有的内容编码到访问路经中,POST 请求的内容全部都在请求体中
- http.ServerRequest 并没有一个属性内容为请求体, 原因是等待请求体传输可能是一件耗时的工作, 如上传文件。
- 而很多时 我们可能并不需要理会请求体的内容, 恶意的 POST 请求会大大消耗 服务器的资源。
- 所以Node.js 认是不会解析请求体的, 你需要的时 , 需要手动来做
5) http.ServerResponse
- http.ServerResponse 是 回给 客户端的 信息,决定了用 户最终能看到的结果
- 它也是由 http.Server 的 request 事件发 的,作为第二个参数传递,一般简称为 response 或 res。
- 三个重要成员函数:
- response.writeHead(statusCode, [headers]) 向请求的客户端发送响应头
- response.write(data, [encoding]) 向请求的客户端发送响应内容
- response.end([data], [encoding]) 响应结束,告知客户端所有发送已经完成。当所有要返回的内容发送完毕时,该函数必须调用一次
2、HTTP客户端
http 模块提供了两个函数 http.request 和 http.get,功能是作为 客户端向 HTTP 服务器发起请求。
- http.request(options, callback) 发 HTTP 请求
- http.get(options, callback) 它是 http.request 的简化版, 一的区别在于http.get 自动将请求方法设为了 GET 请求,同时不需要 动调用 req.end()
1)http.ClientRequest
http.ClientRequest 是由 http.request 或 http.get 返回产生的对象,表示一个已经产生而且正在进行中的 HTTP 请求。
2) http.ClientResponse
http.ClientResponse 与 http.ServerRequest 相似,提供了三 个事件 data、end和 close,分别在数据到达、传输结束和 接结结束时触发,其中 data 事件传递一个参数 chunk,表示接 到的数据。