Node.js常用的原生模块(Node.js自学第五天)

752 阅读7分钟

console模块

Node.js中的console模块提供了一种控制台调试输出机制,类似于Chrome浏览器中console对象的功能。

该模块向外导出了两个成员:
(1)Console class:可用于向任意Node.js输出流对象中执行输出;
(2)global.console实例:可用于向stdout和stderr中执行输出。

console对象

global.console对象的创建过程

global.console=new Console(process.stdout,process.seterr);

process.stdout:当前进程的标准输出流对象
process.stderr:当前进程的标准错误流对象

你也可以自己创建一个console对象:

const cs =require('console');
const fs=require("fs");
const out =fs.createWriteStream('./appout.log');
const err=fs.createWriteStream('./apperr.log');

const logger=new cs.Console(out,err);
var count=5;
logger.log('count:%d',count);
logger.error('count:%d',count);

OS模块

os模块提供了很多用于获得当前操作系统信息的方法。

const os=require('os');

os.EOL									//代表OS End-Of-Line的常量
os.tmpdir()							//返回OS的临时目录
os.hostname()						//返回当前主机名称
os.plateform()					//返回当前OS平台类型
os.uptime()							//返回当前以及运行的时间(/秒)
os.loadavg()						//返回1分钟、5分钟、15分钟的系统平均负载
os.totalmem()						//返回OS总内存大小,单位字节
os.freemem()						//返回OS当前空闲内存大小,单位字节
os.cpus()								//返回所有CPU内核信息
os.networkInterfaces()	//返回所有网络接口信息

Readline模块

readline模块提供的Interface对象,可用于从标准输入对象或者其他输入流对象一行一行的读取的读取数据。

const readline=require('readline');
var reader=readline.createInterface({
	input:process.stdin,
  output:process.stdout
});
reader.question('请输入用户名:',(line)=>{
	console.log('您输入的用户名是: %s...',line);
  reader.close();//使用完必须关闭,否则解释器不会退出
})

Interface对象

Interface对象提供了下述成员可供使用:

属性成员:
input:指定用于读取数据的来源
output:指定写出数据的目标链接

方法成员:
wirte():向指定的output对象中写出数据
close():关闭输入流
setPrompt():设置输入提示符
prompt():输出提示符信息

事件成员:
line:读取到一行数据
end:输入流对象读取到末尾
close:输入流被关闭

使用readline模块模拟一个MySQL命令解释器的效果:

const readline=require('readline');
const reader=readline.createInterface(process.stdin,process.stdout);
reader.setPrompt('MySQL>');
reader.prompt();
reader.on('line',(line)=>{
	if(line==='quit'){
  	reader.close();
    return;
  }
  console.log('Executing...%s',line);
  reader.prompt();
}).on('close',()=>{
	console.log('Bye!');
  process.exit(0);
})

使用readline模块将文件内容逐行读取并输出:

const fs=require("fs");
const readline=require('readline');

var file=fs.createReadStream('./log/out.log');
var reader=readline.createInterface(file,process.stdout);
var num=0;
reader.on('line',(data)=>{
    num++;
    console.log(num+":"+data);
})
reader.on('end',()=>{
    console.log('reading end');
})
reader.on('close',()=>{
    console.log('closeing...');
    process.exit(0);
})
//1:121212
//2:222222
//3:323232
//4:424242
//5:525252
//closeing...

Query String模块

Query String模块提供了URL中的查询字符串部分的操作。

const queryString=require('querystring');

var qs='ie=utf-8&f=8&rsv_bp=1&srcqid=3605558453180587995'
//从查询字符串中解析出来数据对象
console.log(querystring.parse(qs));

var data={cid:'体育',size:'10',pon:'2'};
//将数据对象转换为查询字符串
console.log(querystring.stringify(data));
console.log(querystring.stringify(data,"#"));//可以指定每个键值对的分隔符有,默认是&符
console.log(querystring.stringify(data,"#",":"));//键和值之间的分隔符也可以指定默认是=
//{
//  ie: 'utf-8',
//  f: '8',
//  rsv_bp: '1',
//  srcqid: '3605558453180587995'
//}
//cid=%E4%BD%93%E8%82%B2&size=10&pon=2
//cid=%E4%BD%93%E8%82%B2#size=10#pon=2
//cid:%E4%BD%93%E8%82%B2#size:10#pon:2

querystring模块只能解析查询字符串部分,那么有时候我们想要解析出完整的URL,那么需要使用URL模块。

URL模块

URL模块提供了处理URL中不同部分的相关操作。包含以下三个方法:

const url=require('url');

var requsetUrl='https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&srcqid=3605558453180587995&tn=48020221_20_hao_pg&wd=在线流程图&oq=vision%25E8%25BD%25AF%25E4%25BB%25B6%25E4%25B8%258B%25E8%25BD%25BD&rsv_pq=92df9c4000008d95&rsv_t=1b60taNY6%2BTiridgfP1UaAHne4AOFCHaJasM1Pf8w7rWdCrjxsUDU1aJYYYtiTW6fb%2FpDC%2F%2F%2FM6V&rqlang=cn&rsv_enter=1&rsv_dl=tb&rsv_sug3=35&rsv_sug1=33&rsv_sug7=100&bs=vision软件下载'
console.log(url.parse(requsetUrl));//解析出YRL中的各个组成部分
console.log(url.parse(requsetUrl,true));//将查询字符串解析为对象

var urlObj={
  protocol:"http:",
  slashes:true,
  auth:"tom:123",
  port:"8080",
  hostname:"www.baidu.com",
  hash:"#section3",
  query:{pno:"2"},
  pathname:"/news/n1"
};
console.log(url.format(urlObj));

var baseUrl='/project/static/base.html';
console.log(url.resolve(baseUrl,'../img/1.jpg'));//更具基地址解析出相对的url

Path模块

Path模块提供了对文件路径进行操作的相关方法;这些方法只是进行了字符串的相关转换,与文件系统本身没有任何关联。

const path=require('path');

//解析路径字符串
console.log(path.parse('c:/user/local/img/1.jps'));
//将路径对象转化为字符串
var obj={dir:'c:/user/local/img',base:'1.jps'};
console.log(path.format(obj));
//更具基础路径解析出一个目标路径的绝对路径
console.log(path.resolve('htdocs/css','../img/news'));
//更具基础路径,获取模板路径预期相对的关系
console.log(path.relative('htdocs/css','htdocs/img/news'));
//{
//  root: 'c:/',
//  dir: 'c:/user/local/img',
//  base: '1.jps',
//  ext: '.jps',
//  name: '1'
//}
//c:/user/local/img\1.jps
//H:\myNode\lesson01\htdocs\img\news
//..\img\news

DNS模块

DNS模块提供了域名到IP地址的双向解析功能;包括如下三个主要方法:

const dns=require('dns');
dns.lookup('baidu.com',(err,address,family)=>{
    if (err) throw err;
    console.log("lookup查询到的IP是:",address);//把一个域名解析为一个IP地址
    console.log("lookup查询到的IP格式是:IPv",family)
})
dns.resolve('baidu.com',(err,addresses)=>{
    if (err) throw err;
    console.log(addresses);//把一个域名解析为一个DNS记录解析数组
})
dns.reverse('60.221.254.230',(err,hostnames)=>{
    if (err) throw err;
    console.log(hostnames);//把一个IP地址反向解析为一组域名
})
//lookup查询到的IP是: 39.156.69.79
//lookup查询到的IP格式是:IPv 4
//[ '220.181.38.148', '39.156.69.79' ]
//[ '230.254.221.60.adsl-pool.sx.cn' ]

lookup不需要联网也可以实现,它依赖于底层操作系统,family参数返回是ipv4还是ipv6形式。
resolve不依赖于底层操作系统,要求计算机必须联网,根据DNS服务器查找域名所对应的所有的IP地址信息,可能会是多个IP地址信息,如果没有查询到会返回err。

Util模块

Util模块提供了若干工具方法,供Node.js其他模块和应用开发者使用。


//使用带占位符的格式化字符串
var data={name:"Cola",price:2.5,isOnsale:false};
console.log(
    util.format('Name:%s,PRICE:%d,ISONSALE:%s,JSON:%j',
                data.name,data.price,data.isOnsale,data)
)
//返回一个对象的字符串形式表示
console.log(util.inspect(data));

使用Util模块还可以实现构造方法间的继承

const util=require("util");
const EventRmitter=require('events');

function DBConnection(){
	EventEmitter.call(this);
}
util.inherits(DBConnection,EventEmitter);

var conn=new DBConntion();
console.log(conn instanceof DBConnection);			//true
console.log(conn instanceof EventEmitter);			//true
console.log(DBConnection.super_===EventEmiter);	//true

Error模块

Node.js中"错误对象"分为四类:
(1)原生JS提供的错误类型,如EvalError、SyntaxError、RangeError、ReferenceError、TypeError、URIError;
(2)由操作系统底层限制引起的自动错误,如打开不存在的文件、向关闭的流写出数据;
(3)断言错误;
(3)应用程序抛出的用户自定义错误。

Node.js中所有的错误对象都是Error类型的实例,Error对象可以使用throw关键字进行抛出。

错误处理

同步函数调用中抛出的错误都是直接使用throw关键字实现的,可以使用try...catch结果进行捕获以进一步处理;若不处理,将导致程序崩溃。

const fs=require("fs");
//同步函数调用
try{
	var data=fs.readFileSync('不存在的文件.txt');
}catch(err){
	console.log(err);
}

异步函数调用中抛出的错误对象不能使用try...catch结构进行捕获!错误对象一般作为第一个参数传递给异步回调函数。

const fs=require('fs');
//异步函数调用
fs.readFile('不存在的文件.txt',(err,data)=>{
	if(err){
  	console.log('文件读取失败');
    return;
  }
  console.log('文件内容:',data.toString())
})

如果异步函数调用发生在一个EventEmitter类型的对象上,产生的错误对象可以通过监听其error时间来处理。

const net=require("net");

var connection=net.connection('192.168.0.100');

connection.on('error',(err)=>{
	console.log('无法连接到目标主机');
  return;
});