node的核心模块由一些精简而高效的库组成
文章目录
- 全局对象
- 全局对象和全局变量
- process
- cosole
- util
- utils.inherits
- utils.inspect
- 事件机制
- 事件发射器
- error 事件
- 继承EventEmitter
- 文件系统访问
- fs.readFile(filename,[encoding],[callback(err,data)])
- fs.readFileSync(filename,[encoding])
- fs.open(path,flags,[mode],[callback(err,fd)])
- fs.read(fd,butter,offset,length,position,[callback(err,bytesRead,butter)])
- HTTP服务器与客户端
- http服务器
- http.Sever的事件
- http.SeverResnet
- 获取GET请求内容
- 获取post请求的内容
- http.ServerResponse
- HTTP客户端
- http.request(options,callback) 发送HTTP请求
- http.ClientRequest(客户端请求)
- http.ClientResponse(客户端响应)
全局对象
node中的全局对象是global,所有全局变量都是global的对象的属性。
在console中能够直接访问到的对象通常都是global属性的。
全局对象和全局变量
满足以下条件的变量就是全局变量:
在最外层定义的变量
全局对象的属性
隐式定义的变量(未定义直接赋值的变量)
当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦然。
需要注意的是node.js 不能在最外层定义变量,因为所有用户代码都属于模块,而模块不在最外层。
process
process是一个全局变量,用于描述当前node的进程状态对象,提供一个与操作系统的简单接口。
-
process.argv 命令行参数数组,第一个元素是node ,第二个是脚本文件名,第三个元素开始每个元素是一个运行参数。
- -
process.stdout 标准输出流。通常我们使用的console.log()向标准输出打印字符,而process.stdout.write()函数提供了更加底层的接口。
-
process,stdin 标准输入流,初始时是被暂停,要从输入流读取数据就必须恢复流,并且手动添加流的事件响应函数。
process.stdin.resume()
process.stdin.on('data',function(data){
process.stdout.write('read from console:'+data.toString());
})
- process.nextTick(callback)的功能是为事件循环设置一项任务,node.js会在下次事件循环响应时调用callback。该函数可以将复杂的函数拆散,变成一个个较小的事件。
function dosomething(args,callback){
somethingComplicated(args);
callback();
}
dosomething(function onEnd(){
compute();
});
假设执行compute()和执行somethingComplicated()会消耗很长的时间,在执行dosomething()会调用函数dosomething()然后执行somethingComplicated(),然后再执行回调函数,在函数onEnd()中又会执行compute(),下面用process.nextTick()函数进行改进:
function dosomething(args,callback){
somethingComplicated(args);
process.nextTick(callback);
}
dosomething(function onEnd(){
compute();
});
改进后函数会将其拆分成为两件事情,减少每个事件的执行时间,提高响应速度。
还有很多的process成员,有兴趣的话上http://nodejs.org/api/process.html上了解详情
cosole
用于控制台标准输出
- cosole.log():向标准输出流打印字符,并且以换行符号结束,
- console.error():向标准错误流输出
- console.trace():向标准错误流输出当前的调用栈。
util
utils.inherits
- util.inherits(constructor,superConstructor)是一个实现对象间原形继承的函数。
该函数只能继承原形中定义的函数,在构造函数内部创建的属性和函数都不能被继承
ar util = require('util')
function Base(){
this.name = 'base';
this.base = '1998';
this.sayHello = function(){
console.log('hello'+this.name);
}
}
Base.prototype.showName = function(){
console.log(this.name)
}
function Sub(){
this.name = 'sub';
}
util.inherits(Sub,Base);
var objBase = new Base();
objBase.showName()
objBase.sayHello()
console.log(objBase)
var objSub = new Sub()
objSub.showName()
//objSub.sayHello()
console.log(objSub)
utils.inspect
- utils.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转化成为字符串的方法,通常用于调试和错误输出。至少接收一个参数object ,即要转换的对象。
- showHidden (可选)true 表示会输出更多的隐藏信息,显示更多函数的信息。
- depth 表示最大的递归的层,指定层数控制信息输出多少
- colors 如果是true:表示输出格式会以ANSI颜色编码。
更多关于utils 的工具可以访问:https://nodejs.org/api/util.html
事件机制
events是node.js 的重要的模块,是node.js的编程的基石,几乎被所有的模块依赖。
事件发射器
- events.EventEmitter:的核心是实现发射与事件监听功能的封装。EventEmitter的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常要表达一定的语义,对于每个事件,eventEmitter支持若干个事件监听器。当事件发射时,注册到这个事件的监听器就会被调用,事件参数作为回调函数的参数进行传递。
- EventEmitter.on(event,listener)为指定事件注册一个监听器,接收一个字符event和一个回调函数listener
- EventEmitter.emit(event,[arg1],[arg2],[…])发射事件,传递若干个可选择参数到监听事件的参数表中。
- EventEmitter.once(event,listener)为指定事件执行单次监听,触发监听后立刻解除监听。
- EventEmitter.removeListener(event,listener)移除指定事件的某个监听。
- EventEmitter.removeAllListener(event,liatener)移除摸个事件的所有监听
error 事件
EventEmitter定义了一个特殊的事件error,包含了错误的语义,我们在遇到异常的时候会发射error事件。当error事件被发射时,EventEmitter规定如果没有相应的监听器,node.js会把他当做异常,退出程序并打印调用栈。一般要为发射error事件的对象设置监听器,避免遇到错误后整个程序崩盘。
继承EventEmitter
一般情况下不会直接使用EventEmitter,而是在对象中继承它,
文件系统访问
fs模块是文件操作的封装,提供文件的读取,写入,更名,删除,遍历目录等系统操作。
有异步和同步两个版本。
fs.readFile(filename,[encoding],[callback(err,data)])
- filename 表示要读取的文件名称
- ecoding (可选)表示文件的字符编码,默认是以Buffer的形式表示的二进制数据
- callback 表示回调函数 用于接收文件的内容 err 表示有没有发生错误,data表示的文件的内容,
fs.readFileSync(filename,[encoding])
fs.readFileSync是fs.readFile的同步版本。不同之处在于读取到的内容会以函数返回值的形式返回,如果遇到错误就会抛出异常,需要用try 和catch去捕捉异常。
fs.open(path,flags,[mode],[callback(err,fd)])
- path 文件的路径
- flag可以是以下信息:
r: | 以读取的模式打开文章 |
r+: | 以读写的模式打开文章 |
w: | 以写的模式打开文章,如果文章不存在则创建 |
w+: | 以读写的模式打开文章,如果文章不存在则创建 |
a: | 以追加的方式打开文章,如果文件不存在则创建 |
a+: | 以读取追加的模式打开文件,如果文件不存在则创建 |
- mode 用于创建文件时给文件指定权限,默认是0666,回调函数将会传递一个文件描述符fd
fs.read(fd,butter,offset,length,position,[callback(err,bytesRead,butter)])
相比fs.readFlie() 提供了一个更加底层的信息 ,fs.read的功能是从指定的文件描述符中fd读取数据并且写入buffer指向的缓冲对象。offset是buffer的写入偏移量。length表示要从文件中取出的字节数。position 是文件的读取的起始位置,如果position的值为null,表示从文件的指针的位置读取。回到函数的bytesRead和buffer表示读取数据的字节数和缓冲对象。
如下图为fs的所有函数的定义和功能。
HTTP服务器与客户端
http服务器
http.Server是http模块的http服务对象,用node.js做的所有基于http协议的系统,都是http.Server实现的,
http.Sever的事件
提供了以下事件:
- request:当客户端请求到来时,改事件会被触发,提供两个参数req 和res 表示请求和响应信息。
- connection:当TCP连接建立时候,该事件会被触发。
- close:当服务器关闭的时候会被触发。
- http.creatEServer([requestListener])
http.SeverResnet
是http的请求信息,是http.Sever的request事件发送的第一个参数,具体的属性有:
http的请求一般包括请求头部和请求体,请求头部比较短,不需要解析很长时间,但是请求体比较长,需要要事件控制:
- data:请求体到来时,事件被触发,参数Chunk:表示接收到的信息。如果该事件没有被监听。收到的信息就会被抛弃。
- end :请求数据传输完成后会触发的事件
- close:用户请求完成后,事件被触发,用户提前终止
获取GET请求内容
node.js中的URL模块的parse函数提供了手动解析后面的内容作为GET请求的参数。
获取post请求的内容
post的请求的内容全部在请求体内,http.ServerRequest没有一个属性内容为请求体,是因为等待请求体传输是一件很耗时的工作,所以node.js默认不会解析请求体,当需要请求体时候,需要手动解析。
http.ServerResponse
http.ServerResponse是返回给客户端的信息,决定了用户最终能够看到的结果。是http.Sever的request事件发送的第二个参数:response或者res’
- response.writeHead(statusCode,[headers]):向请求的客户端发送响应头,statusCode表示HTTP的状态码如:200(请求成功);404(未找到)等;headers表示响应头部的每个属性,该函数在一个请求内最多只能调用一次,如果不调用,则会自动生成一个响应头。
- response.write(data,[encording]):向请求客户端发送响应内容:data:是一个buffer或者是字符串,表示要发送的内容,如果data是字符串,需要指定encording来说明编码方式,默认:utf-8
- response.end(data,[encording]):结束响应,当要返回的值被发送完毕后,该函数必须被调用一次,如果不调用,客户端永远在等待状态。
HTTP客户端
http.request(options,callback) 发送HTTP请求
- options:表示请求参数
host | 请求网站的域名或者是IP地址 |
port | 请求网站的端口,默认:80 |
method | 请求方式:默认是GET |
path | 请求的相对路径 |
headers | 一个关联的对象,为请求的头的内容 |
- callback:表示请求回调函数,
http.ClientRequest(客户端请求)
是http.get或者是http.request的返回值,表示一个已经产生而且正在进行的http请求。提供了一个response事件,即http.request或者是http.get第二个参数指定的回调函数绑定的对象,。
提供了write和end函数用于向服务器发送请求体。还提供了:
- request.abort() 终止正在发送的请求
- request.setTimeout(timeout,[callback]):设置请求超时时间,timeout为毫秒单位。当请求超时以后,callback将会被调用。
http.ClientResponse(客户端响应)
与http.ServerRequest相似,提供了三个事件:data ,end和close 分别再数据到达,传输结束和连接结束触发,其中data事件传递的一个参数chunk,表示接收的数据信息
http.ClientResponse也提供了一些属性,用于表示请求的结果状态。
http.ClientRespanse还提供了几个特殊的函数:
- response.setEncoding([encoding]):设置默认的编码
- response.pause():暂停接收数据和发送事件
- response.resume():从暂停的状态恢复。