Node.js开发指南学习笔记

# Node.js核心模块

全局对象

global

全局变量

process

console

常用工具util

util.inherits

函数只会继承原型中定义的方法,不会继承构造函数中的方法和属性。

util.inherits(constructor, superConstructor);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var util = require('util');

function Base(){
this.name = 'Base';
this.base = 1991;
this.sayHello = function(){
console.log('Hello' + this.name);
}
}
Base.prototype.showName = funciton(){
consoel.log(this.name);
}

function Sub(){
this.name = 'sub';
}

util.inherts(Sub, Base);

var objBase = new Base();
objBase.showName();
objBase.sayHello();
console.log(objBase);

var objSub = new Sub();
objSub.showName();
console.log(objSub);

Sub仅继承了Base在原型中定义的函数,而构造函数内部的base属性和sayHello函数没有被Sub继承。

util.inspect

将任意对象转换为字符串的方法,至少接受一个参数。
util.inspect(object, [showHidden], [depth], [colors])

  • object,要转换的对象。
  • showHidden: 若为true,将输出更多隐藏信息。
  • depth 表示最大递归层数,如不指定默认为2层。
  • color 值若为true,将以ANSI颜色编码,通常用于终端显示更漂亮。

util.inspect并不会直接把对象转换为字符串,即使该对象定义了toString()方法也不会调用。

util.isArray()/util.isRegExp()/util.isDate()/util.isError()

util.format()/util.debug()

事件驱动 events

events是Node.js最重要的模块,没有之一。

事件发射器

events模块只提供了一个对象:events.EventEmitter。EventEmitter的核心就是事件发射与事件监听器功能的封装。

  • EventEmitter.on(event, listener)为指定事件注册一个监听器。接受一个字符串event和一个回调函数listener。
  • EventEmitter.emit(event, [arg1],[arg2],[…])发射event事件,传递若干参数到事件监听器的参数表。
  • EventEmitter.once(event), listener)为指定事件注册一个单次监听器。最多只触发一次,触发后立即解除该监听器。
  • EventEmitter.remove(event, listener)移除指定事件的某个监听器,listener必须是该事件已经注册过的监听器。
  • EventEmitter.removeAllListeners([event])移除所有事件的所有监听器。

error事件,为发射error事件的对象设置监听器,避免遇到错误后整个程序崩溃。

文件系统fs

fs模块是文件操作的封装,提供了文件的读取、写入、更名、删除、遍历目录、链接等POSIX文件操作系统。fs模块中所有的操作都提供了异步和同步版本。

fs.readFile

fs.readFile(filename,[encoding],[callback(err,data)])
接受一个必选参数filename,表示要读取的文件名。第二个参数encoding是可选的,表示字符编码。callbakck是回调函数,用于接收文件的内容。

fs.readFileSync同步读取

如果有错误发生,需要使用try catch捕捉异常。

fs.open

fs.open(path, flags, [mode], [callback(err, fd)])是POSIX open函数的封装。
接受两个必选参数:path 为文件路径, flag指定相应模式。
mode参数用于创建文件时给文件指定权限。回调函数将会传递一个文件描述符fd。

fs.read

fs.read(fd, buffer, offset, length, position, [callback(err, bytesRead, buffer)])
fs.read从指定的文件描述符fd中读取数据并写入buffer指向的缓冲区对象。offset是buffer的写入偏移量。length是要从文件中读取的字节数。position是文件读取的起始位置,如果position的值为null,则会从文件指针的位置读取。回调函数传递bytesRead和buffer,分别表示读取的字节数和缓冲区对象。

HTTP服务器与客户端

HTTP服务器

http.server是http模块中的HTTP服务器对象,用Node.js做的所有基于HTTP协议的系统,都是基于http.Server实现的。

http.Server事件

http.Server是一个基于事件的HTTP服务器,继承自EventEmitter,提供了以下几个事件:

  • request: 当客户端请求到来时,该事件触发,提供两个参数req和res,分别是http.ServerRequest和http.ServerResponse的实例,表示请求和响应信息。
  • connection: 当TCP连接建立时,该事件被触发,提供一个参数socket,为net.Socket的实例。
  • close: 当服务器关闭时,该事件被触发,注意不是在用户连接断开时。

最常用的是request,http提供了一个捷径: http.createServer([requestListener])–创建一个HTTP服务器并将requestListener作为request事件的监听函数。

1
2
3
4
5
6
var http = require('http');
http.createServer(function(request, response){
response.writeHead(200,{'Content-Type': 'text/plain'});
response.write('hello');
response.end();
}).listen('8888');

获取GET请求

获取POST请求

http.ServerResponse

返回给客户端的信息。
http.ServerResponse有三个重要的成员函数,用于返回响应头、响应内容以及结束请求。

  • response.writeHead(statusCode, [headers]): 向请求的客户端发送响应头。 statusCode是HTTP状态码。headers是一个类似关联数组的对象,表示响应头的每个属性。该函数在一个请求内最多只能调用一次,如果不调用,则会自动生成一个响应头。
  • response.write(data, [encoding]): 向请求的客户端发送响应内容。data是一个Buffer或字符串,表示要发送的内容。如果data是字符串,那么需要指定encoding来说明它的编码方式,默认是utf-8。
  • response.end(data, [encoding]): 结束响应。当所用要返回的内容发送完毕后,该函数必须被调用一次。接受两个可选参数,意义和response.write相同。如果不调用该函数,客户端永远处于等待状态。

HTTP客户端

http模块提供了两个函数http.request和http.get,功能是作为客户端向HTTP服务器发起请求。

  • http.request(options, callback): 发起HTTP请求。接受两个参数,option是一个类似关联数组的对象,表示请求的参数, callback是请求回调函数,传递一个参数,为http.ClientResponse的实例。
    http.request返回一个http.ClientRequest的实例。

option常用参数如下:
host :请求网站的域名或 IP 地址。
port :请求网站的端口,默认 80。
method :请求方法,默认是 GET。
path :请求的相对于根的路径,默认是“/”。QueryString 应该包含在其中。例如 /search?query=byvoid。
headers :一个关联数组对象,为请求头的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var http = require('http');
var querystring = require('querystring');

var contents = querystring.stringify({
name: 'node',
emial: 'nodejs@node.com',
address: 'node street'
});

var options = {
'host': 'www.nodejs.com',
'path': '/api/node',
'method': 'POST',
'headers':{
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': contents.length
}
}

var req = http.request(options, function(res){
res.setEncoding('utf8');
res.on('data', function(data){
console.log(data);
})
})
req.write(contents);
req.end();
  • http.get(options, callback): http模块提供了一个简单的方法用于处理GET请求:http.get。它是http.request的简化版,唯一区别在于http.get自动将请求方法设为了GET请求,同时不需要手动调用req.end()。
1
2
3
4
5
6
7
var http = require('http');
http.get({host:'www.nodejs.com'}, function(res){
res.setEncoding('utf8');
res.on('data', function(data){
console.log(data);
})
})
  • http.ClientRequest是由http.request或http.get返回产生的对象,表示一个已经产生且正在进行中的HTTP请求。提供一个response事件,即http.request或http.get第二个参数指定的回调函数的绑定对象。
    http.ClientRequest像http.ServerResponse一样也提供了write和end函数,用于向服务器发送请求体。通常用于POST、PUT等操作。所有写结束后必须调用end函数以通知服务器,否则请求无效。
    1 request.abort():终止正在发送的请求
    2 request.setTimeout(timeout, [callback]):设置请求超时时间,timeout为毫秒数。当请求超时以后,callback将会被调用。
1
2
3
4
5
6
7
8
var http = require('http');
var req = http.get({'host': 'www.nodejs.com'});
req.on('response', function(res){
res.setEncoding('utf8');
res.on('data', function(data){
console.log(data);
})
})
  • http.ClientResponse与http.ServerRequest相似,提供了三个事件:data、end和close,分别在数据到达、传输结束和连接结束时触发。其中data事件传递一个参数chunk,表示接收到的数据。
    http.ClientResponse还提供了以下几个特殊的函数:
    1 response.setEncoding([encoding]):设置默认的编码,当data事件被触发时,数据将会以encoding编码。默认值是null,即不编码,以buffer的形式存储。
    2 response.pause():暂停接受数据和发送事件,方便实现下载功能。
    3 response.resume():从暂停的状态中恢复。