Node.js之Web开发入门(常用API)-No.3

1、Path(官网路径)

1、path.normalize() 方法会规范化给定的 path

2、path.join() 方法使用平台特定的分隔符把全部给定的 path 片段连接到一起,并规范化生成的路径。

3、path.resolve() 方法会把一个路径或路径片段的序列解析为一个绝对路径。

4、path.dirname() 方法返回一个 path 的目录名。

5、path.basename() 方法返回一个 path 的最后一部分。

6、path.extname() 方法返回 path 的扩展名。

7、path.parse() 方法返回一个对象,对象的属性表示 path 的元素。 

8、path.format() 方法会从一个对象返回一个路径字符串。

2、Buffer(官网路径)

1、buffer的三个要点

(1)buffer是用于处理二进制数据流的,是个全局变量

(2)buffer实例类似整数数组,大小固定

(3)C++代码在V8堆外分配物理内存

2、几个buffer创建实例

// 创建一个长度为 10、且用 0 填充的 Buffer。
const buf1 = Buffer.alloc(10);

结果就是

// 创建一个长度为 10、且用 0x1 填充的 Buffer。 
const buf2 = Buffer.alloc(10, 1);

结果就是

// 创建一个长度为 10、且未初始化的 Buffer。
// 这个方法比调用 Buffer.alloc() 更快,
// 但返回的 Buffer 实例可能包含旧数据,
// 因此需要使用 fill() 或 write() 重写。
const buf3 = Buffer.allocUnsafe(10);

结果是随机的十个数

// 创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf4 = Buffer.from([1, 2, 3]);

结果就是

// 创建一个包含 UTF-8 字节 [0x74, 0xc3, 0xa9, 0x73, 0x74] 的 Buffer。
const buf5 = Buffer.from('tést');

结果就是

如果是字符串的方式,后面还能跟第二个参数,可以是base64等,默认是UTF-8。

3、Buffer中常用类的几个API

(1)Buffer.bytelength返回一个字符串的实际字节长度

console.log(Buffer.byteLength('test'))
console.log(Buffer.byteLength('哈哈'))

结果是4 6,那么意思即一个字母是1个字节,一个汉字是3个字节

(2)Buffer.isBuffer(obj)判断一个对象是不是Buffer对象,是返回true,否返回false

(3)Buffer.concat(list[,totallength])返回一个一刀999级合并了list中所有Buffer实例的新建的Buffer 。

4、Buffer中常用的实例的方法

(1)buf.length:buf对象的长度

(2)buf.toString():buf对象转化为字符串

(3)buf.fill():填充内容,比如buf.fill(10,2,6)意思即从第2个数到第6个数之间填充10,即3、4、5、6这四个数被填10,十六进制来表示就是0a

(4)buf.equals():比较两个buf的内容是否一样,比如buf1.equals(buf2)

(5)buf.indexOf(string):寻找匹配的值,返回匹配值所在的位置。

(6)buf.copy():拷贝buf的一个区域的数据到target的一个区域,即便target的内存区域与buf的重叠。比如说

5、中文乱码的问题

但出现中文乱码的时候就使用StringDecoder来解决

const StringDecoder=require('string_decoder')
const decoder=new StringDecoder('utf8');
.....
console.log(decoder.write(b))

3、event(事件)(官网)

(1)普遍情况
const EventEmitter=require('events');

class CustomEvent extends EventEmitter{}
const ce=new CustomEvent()

ce.on('test',(canshu)=>{    //这里可以传多个参数
    console.log(canshu)
    console.log('this is a test')
});
setInterval(()=>{
    ce.emit('test','This is canshu')
},500)
结果就是每间隔0.5秒就打印This is canshu和this is a test
(2)只需触发一次的情况
上面的代码我们使用的是on()方法来邦定事件,现在将ce.on换成ce.once()就只会触发一次

(3)事件的移除(https://blog.csdn.net/weixin_37968345/article/details/80775142)

4、fs(文件系统)(官网)

1、fs.readFile(path[,options],callback): 异步地读取一个文件的全部内容(异步操作)
const fs=require('fs')

fs.readFile('./process.js',(err,data)=>{
    if(err)throw err;
    console.log(data.toString())
})

上面的结果就是读取文件自己,当然如果没有toString()方法则就是输出的buffer,也可使用fs.readFile()方法的第二个参数,将第二个参数写为‘utf8,文件也能读取到字符串内容。

2、fs.readFiLeSync(同步操作)

const data=fs.readFileSync('./process.js','utf8')
console.log(data)
3、fs.writeFile(file ,data[,options],callback): 异步地写入数据到文件,如果文件已经存在,则覆盖文件。

5、Stream

流(stream)在 Node.js 中是处理流数据的抽象接口。 stream 模块提供了基础的 API 。使用这些 API 可以很容易地来构建实现流接口的对象。

Node.js 提供了多种流对象。 例如 HTTP请求和 process.stdout 都是流的实例。

流可以是可读的、可写的、或是可读写的。 所有的流都是 EventEmitter 的实例。

stream 模块可以通过以下方式引入:

const stream = require('stream');

尽管理解流的工作方式很重要,但是 stream 模块本身主要用于开发者创建新类型的流实例。 对于大多数以消费流对象为主的开发者来说,极少需要直接使用 stream 模块。

const fs=require('fs')
const rs=fs.createReadStream('./process.js')
rs.pipe(process.stdout)

上面的代码创建一个可读流,源头是process.js文件,流输出是终端,对于流的概念很关键,和刚才的fs.readFile并不一样,readFile是一次性读完显示,流是读一点显示一点,就像网页卡的时候都是从上到下一点点的显示。

const fs=require('fs')

const ws=fs.createWriteStream('./text.txt') //向text.txt文件写入

const tid=setInterval(()=>{
    const num=parseInt(Math.random()*10);// 随机生成10以内的整数
    console.log(num);
    if(num<9){
        ws.write(num+'')   //使用steam,要么write字符串,要么write一个buffer,不能是数字
    }else{
        ws.end();clearInterval(tid)//关闭定时器
    }
},300)

ws.on('finish',()=>{
    console.log('done')
})

上面的代码就是使用流的方式就随机小于9的整数写入text文本中

你可能感兴趣的:(Node.js之Web开发入门(常用API)-No.3)