一、querystring模块
querystring从字面上的意思就是查询字符串,一般是对http请求所带的数据进行数据解析
querystring模块只提供了四个方法,分别是
querystring.parse
querystring.stringify
querystring.escape
querystring.unescape
在使用querystring模块之前,我们需要引入模块
var querystring = require("querystring");
虽然引入了这个模块,但是我们也必须在该文件父级路径下安装 querystring 模块,使用如下命令即可安装:
sudo npm install querystring
这样我们就可以使用querystring的方法了
(一)querystring.parse(str,separator,eq,options)
parse方法是讲一个字符串转化为对象
参数说明:
str:指需要转化的字符串
separator:(可省)用于分割str这个字符串的字符或者字符串,默认是“&”
eq:(可省)指用于划分键和值的字符或者字符串,默认是“=”
options:(可省)该参数是一个对象,里面可设置maxKeys和decodeURIComponent这两个属性:
maxKeys:传入一个number类型,指定解析键值对的最大值,默认值为1000,如果设置为0时,则取消解析的数量限制;
decodeURIComponent:传入一个function,用于对含有%的字符串进行解码,默认值为querystring.unescape。在官方API的例子中,使用gbkDecodeURIComponent这个方法会报错,显示gbkDecodeURIComponent is no defined,这是因为在使用这个gbkDecodeURIComponent这个方法之前需要先进行定义。在API中也写了Assuming gbkDecodeURIComponent function already exists...这句话的意思是”假设这个gbkDecodeURIComponent方法已经存在”。
比如:
var str1 = "name=lisa&age=20&sex=女";
var res1= querystring.parse(str1);
console.log(res1);
结果:{ name: 'lisa', age: '20', sex: '女' }
var str1 = "name:lisa*age:20*sex:女";
var res1= querystring.parse(str1,"*",":");
console.log(res1);
结果:{ name: 'lisa', age: '20', sex: '女' }
(二)querystring.stringify(obj,separator,eq,options)
stringify方法是将一个对象转化为一个字符串,可以看做与querystring.parse()相对
参数说明:
obj:指需要转化为字符串的对象
separator、eq参数同上
options (可省)传入一个对象,,该对象可设置encodeURIComponent这个属性:
encodeURIComponent:值的类型为function,可以将一个不安全的url字符串转换成百分比的形式,默认值为querystring.escape()。
例如:
var str2 = {name:"Mack",age:20,height:"180cm"};
var res2 = querystring.stringify(str2);
console.log(res2);
结果:name=Mack&age=20&height=180cm
var str2 = {name:"Mack",age:20,height:"180cm"};
var res2 = querystring.stringify(str2,"+","@");
console.log(res2);
结果:name@Mack+age@20+height@180cm
(三)querystring.escape(str)
escape可使传入的字符串进行编码
例如:
var str3 = "name=大卫";
var res3 = querystring.escape(str3);
console.log(res3);
结果:name%3D%E5%A4%A7%E5%8D%AB
(四)querystring.unescape(str)
网上说unescape可将含有%的字符串进行解码
例如:
var str4 = "name%3D%E5%A4%A7%E5%8D%AB";
var res4 = querystring.unescape(str4);
console.log(res4);
结果:name=大卫
从后面两个方法我们可以看出
等于号“=”编码后是%3D
英文编码后还是自身
汉字编码后是由3个%组成
一、util模块
util模块中提供了一些判断和继承,比如
在使用util模块之前,我们需要引入模块
var util = require("util");
虽然引入了这个模块,但是我们也必须在该文件父级路径下安装 util 模块,使用如下命令即可安装:
sudo npm install util
这样我们就可以使用util的方法了
(一)util.inherits(constructor, superConstructor)
从一个构造函数constructor继承原型方法到另一个。构造函数的原型将被设置为一个新的从超类(superConstructor)创建的对象。inherits方法可以实现原型的继承,不会涉及传址问题
function Dad(){
this.name = "张三";
this.age = 30;
this.hobby = function(){
console.log("吃鸡");
}
}
Dad.prototype.money = function(){ //原型
console.log("我有很多钱");
}
function Son(){
Dad.call(this); //构造函数继承
this.height= "178cm";
}
Son.prototype.sex = function(){
console.log("男");
}
util.inherits(Son,Dad);
var newSon = new Son();
console.log(newSon.name,newSon.age,newSon.height); //张三 30 178cm
newSon.money(); //我有很多钱
newSon.hobby(); //吃鸡
newSon.sex(); //男
(二)util.inspect(obj)
inspect方法把对象转化为字符串
var obj = {name:"李四",age:18}; //对象Object
var newstr = util.inspect(obj);
console.log(newstr); //字符串 { name: '李四', age: 18 }
(三)util.isArray
判断值类型是否为数组
例如:
var arr=["张三","李四","王尔"];
var res = util.isArray(arr);
console.log(res); //true
(四)util.isString
判断是否是字符串
例如:
var arr=["张三","李四","王尔"];
var res2 = util.isString(arr);
console.log(res2); //false
util还有许多方法,这里就不一一举例了,有心去可以去百度看看
三、event模块
event模块是nodejs系统中十分重要的一个模块,使用该模块可以实现时间的绑定的触发,为什么要需要这个模块呢?因为nodejs是单线程异步的。
==单线程==:
一次只能处理一个任务,只有当线程空闲时才能处理下一个任务。
==异步==:
在线程处理时,我们仍然可以将要处理的任务放到等待执行的队列中,也就是说线程的处理和我们读取代码放任务到等待执行队列上这个两个行为是可以同步进行的,即异步。
event模块的主要方法有:
- on:添加事件(事件队列尾部添加)
- addListener 事件绑定
- once 添加只能触发一次便失效的事件(事件队列尾部添加)
- emit 触发事件(可多次触发)
- setMaxListeners 设置最大的监听数量
- removeListener移除掉单个事件
在使用util模块之前,我们需要引入模块
var events = require("events");
虽然引入了这个模块,但是我们也必须在该文件父级路径下安装 events 模块,使用如下命令即可安装:
sudo npm install events
这样我们就可以使用events的方法了
// 引入events事件模块
var events= require("events");
// 引入util模块
var util = require("util");
function Dad(){
//创建一个Dad类,让他拥有一些事件
}
//要让Dad拥有事件方法,必须要先继承events模块
util.inherits(Dad,events);
//实例化
var newDad = new Dad();
// //定义test方法
function test(){
console.log("我是test方法");
}
function myfn(){
console.log("我是myfn方法");
}
//-------addListener()参数一:自定义事件名称;参数二:方法名---------
newDad.addListener("lee",test);
newDad.addListener("lee",myfn);
//----------on-------------
newDad.on("lee",test);
newDad.on("lee",myfn);
//------------emit事件触发(可以多次触发)--------------
newDad.emit("lee"); //我是test方法我是myfn方法
newDad.emit("lee"); //我是test方法我是myfn方法
//---------removeListener()移除事件----------
newDad.removeListener("lee",test); //移除单个事件
//newDad.removeAllListeners(); //移除所有的的事件
//----------设置最大的监听数量-------
newDad.setMaxListeners(1);
如果我们设置最大监听数量是1的话,我们如果在下面用emit多次触发事件,服务器就会提醒
//==========once(只能被触发一次)=========
newDad.once("onceEmit",test);
newDad.emit("onceEmit"); //只能被触发一次
newDad.emit("onceEmit");
用once绑定的事件只能触发一次就会失效,无论我们认为触发几次,它都会只执行一次
四、buffer模块
buffer:缓存区,暂时存放在内存里的一段数据,JavaScript 语言自身只有字符串数据类型,没有二进制数据类型,在处理文件流时,必须使用到二进制数据,因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。由一个八位字节一个字节元素组成的数组,单位用16进制表示,取值范围为0-255。
那我们如何创建一个buffer对象呢?
这里介绍三种方法
==buffer转化为字符串用toString()==
(一)方法一:直接创建
//随机生成10位的Buffer
var buffer = new Buffer(10);
console.log(buffer); //
var buffer = new Buffer(10); //随机生成10位的Buffer
console.log(buffer); //
//从第三位开始更改(包含第三位)
buffer.fill(255,3);
console.log(buffer); //
var buffer = new Buffer(10); //随机生成10位的Buffer
console.log(buffer); //
//从第三位开始更改到第五位,包括第三位,不包括第五位
buffer.fill(255,3,5);
console.log(buffer); //
(二)方法二:通过字符串创建
var buffer = new Buffer("大家好");
console.log(buffer); //
//(编码格式转换,处理buffer)
console.log(buffer.toString()); //大家好
(三)方法三:通过数组
var buffer = new Buffer([0xe5,0xa4,0xa7,0xe5,0xae,0xb6,0xe5,0xa5,0xbd]); //一个汉字字符三个码
console.log(buffer.toString()); //大家好
下面我们将上面的buffer码拆分成两个,则"家"被拆分
var buffer1 = new Buffer([0xe5,0xa4,0xa7,0xe5,0xae]); //将上面的码拆开
var buffer2 = new Buffer([0xb6,0xe5,0xa5,0xbd]);
console.log(buffer1.toString()); //大��
console.log(buffer2.toString()); //�好
那么有拆分就会有拼接
//buffer编码拼接
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log(buffer3); //
console.log(buffer3.toString()); //大家好
上面的情况我们将buffer码拆分后,就出现了乱码,那乱码怎么解决呢?
那我们就需要引入nodejs处理乱码的模块string_decoder,还需要在终端安装这个模块
sudo npm install string_decoder
var StringDecoder = require("string_decoder").StringDecoder; //引入模块,处理乱码
var decode = new StringDecoder();
var buffer = new Buffer([0xe5,0xa4,0xa7,0xe5,0xae,0xb6,0xe5,0xa5,0xbd]); //一个汉字字符三个码
var buffer1 = new Buffer([0xe5,0xa4,0xa7,0xe5,0xae]);
var buffer2 = new Buffer([0xb6,0xe5,0xa5,0xbd]);
var res1 = decode.write(buffer1);
console.log(res1); //大
var res2 = decode.write(buffer2);
console.log(res2); //家好