【第四章—核心模块】《node.js开发指南》读书笔记

本文深入探讨Node.js的核心模块,包括全局对象、事件驱动、文件系统及HTTP服务器的使用。详细讲解了process、console、util、fs和http模块的功能与实践。

第四章 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一样。如果不调用该函数,客户端将用于处于等待状态。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值