第四章 Node.js核心模块
4.1 全局对象
全局对象即在任何地方都可以访问的对象。浏览器中通常window是全局对象。而在node中global是全局对象。
在node中,console、process都是global的属性。
4.1.2 process
process是global的对象属性,它用于描述Node进程状态的对象,提供了一个简单的与操作系统接口。
执行 node test.js a b c
//test.js
console.log(process.argv);
//输出内容
[
'C:\\Program Files\\nodejs\\node.exe',
'C:\\Users\\Lenin\\Desktop\\320\\kaifazhinan\\text.js',
'a',
'b',
'c'
]
便会输出运行参数。
4.1.3 console
console是node的控制台标准输出。
log向标准输出流(stdout)输出字符,error和trace向标准错误流(stderr)输出字符。
其中trace输出当前的调用栈。
console.log('hello world'); //标准输出流
console.error('error'); //标准错误流
console.trace(); //向标准错误流输出当前调用栈
4.2 常用工具 util
util是node的核心模块,提供常用函数集合,用于弥补js功能的不足。
ps:书中没有全面介绍util。推荐util官方api文档:http://nodejs.cn/api/util.html
4.2.1 util.inherits
//util.inherits 实现对象原型链继承
var util = require('util');
function Base(){
this.name = 'base';
this.base = '1999';
}
Base.prototype.showName = function(){
console.log(this.name);
}
function Sub(){
this.name = 'sophie'
}
util.inherits(Sub,Base); //使用
const base = new Base();
const sub = new Sub();
base.showName(); //输出base
sub.showName(); //输出sub
sub继承了base的原型链属性,所以它也可以使用showname()
4.2.2 util.inspect
util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出。它至少接受一个参数 object,即要转换的对象。
showHidden:如果为true会输出隐藏信息。
depth:表示最大递归层数
colors:为true会是彩色的
const util = require('util');
function Person(){
this.name = 'byvoid';
this.toString = function(){
return this.name;
};
}
var obj = new Person();
console.log(util.inspect(obj));
console.log(util.inspect(obj,true,10,true));
4.3 事件驱动
events模块只提供了一个对象,events.EventEmitter。EvntEmitter的核心就是发射和监听事件封装。
事件名为一个字符串,对于每个事件支持若干事件监听器。事件发射时。注册到这个监听事件依次调用。
var events = require('events');
var emitter = new events.EventEmitter();
emitter.on('e',(value)=>{
console.log("trigger event value:",value);
})
emitter.emit('e','sophie');
注册事件监听器:EventEmitter.on(event,listener);
发射事件:EventEmitter.emit(event,[arg1],[arg2]...);
注册触发一次后销毁事件:EventEmitter.once(event, listener);
移除某个事件的监听器:EventEmitter.removeListener(event, listener);
移除某个事件所有监听器:EventEmitter.removeAllListeners([event])
4.3.2 error事件
EventEmitter定义了一个特殊的事件error,如果没有定义响应事件,会把他当作异常退出程序和并打印调用栈。
var events = require('events');
var emitter = new events.EventEmitter();
emitter.emit('error');
4.3.2 继承
大多数时候我们不会直接使用eventEmitter,而是在对象中继承他。包括fs、net、http在内的,只要支持事件响应的核心模块都是eventEmitter的子类。
4.4 文件系统
fs是文件操作封装,包括读取,写入,更名,遍历目录等。
4.4.1 fs.readFile
var fs = require('fs');
fs.readFile('data.txt','utf-8',function(err,data){
if(err){
console.err();
}else{
console.log(data);
}
})
4.4.2 fs.readFileSync
同步版本
let data = fs.readFileSync('data.txt','utf-8');
console.log(data);
4.5 HTTP服务器
node提供了http模块,封装了一个高效的HTTP和简易的HTTP客户端和一个简易的HTTP客户端。
4.5.1 HTTP 服务器
http.server是http模块中的http服务器对象。它只提供了一套封装基本很低的的API,仅仅是流控制和简单消息解析。所有的高层功能都要通过他的接口来解析。
//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.end('<p>Hello World</p>');
}).listen(3000);
console.log("HTTP server is listening at port 3000.");
1.http.server 事件
http.Server是一个基于事件的HTTP服务器。所有的请求都被封装为独立的事件。开发者只需编写事件相应函数即可实现HTTP服务器所有功能。他继承于EventEmitter提供以下几个事件:
request:当客户端请求到来时即被触发,提供req,res两个参数,分别是http.ServerRequest 和 http.ServerResponse 的实例。
connection:当TCP连接建立时,事件粒度要大于request。(暂时没接触到,不懂,不继续描述)
close:当服务器关闭时被触发,并不是用户断开连接时。
除此之外还有 checkContinue、 upgrade、 clientError 事件,本书没有继续介绍。
2.http.ServerRequest
http.ServerRequest是http请求信息,通常简称req。
HTTP请求一般分为两部分,请求头(Requst Header)和请求体(Request Body)。请求头可以立刻解析,请求体相对较长。需要一定时间传输,所以请求体由三个事件控制传输:
data:当请求到来时触发,会提供一个chunk,表述接收到的数据。
end:请求传输完毕触发,此后不会有数据到来。
close:当前用户请求结束时,被触发,用户强制终止也触发。
3.获得GET请求内容
const http = require('http');
const util = require('util');
const url = require('url');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'content-type': 'text/plain' });
console.log(url.parse(req.url));
res.end(util.inspect(url.parse(req.url)));
});
server.listen(3000);
5.http.ServerResponse
是返回给客户端的信息,决定了用户能看到的内容。简称res。
http.ServerResponse有三个重要成员函数。
response.writeHead(statusCode, [headers]):返回响应头
response.write(data, [encoding]):发送响应信息,encoding是编码方式,默认utf-8
response.end([data], [encoding]):告之客户端已经发送完成,其他意义和write一样。如果不调用该函数,客户端将用于处于等待状态。
本文深入探讨Node.js的核心模块,包括全局对象、事件驱动、文件系统及HTTP服务器的使用。详细讲解了process、console、util、fs和http模块的功能与实践。

被折叠的 条评论
为什么被折叠?



