小满zs专栏:juejin.cn/column/7274…
events 模块
用于处理和触发事件,模块提供了 EventEmitter 类,通过继承这个类,可以使对象具有注册监听器、触发事件的能力
Nodejs 核心API都是采用异步事件驱动架构,简单说就是通过有效的方法监听事件状态的变化,并在变化的时候做出相应的动作。Nodejs 事件模型采用了发布订阅设计模式
const EventEmitter = require('events');
const event = new EventEmitter()
//监听test
event.on('test',(data)=>{
console.log(data)
})
event.emit('test','xmxmxmxmx') //派发事件
- 监听的消息数量默认10个,可以通过
event.setMaxListeners(20)修改 - 除了 emit、on 外,还有 once、off,分别指仅监听一次和取消监听
util 模块
util 提供了很多实用或工具类型的API,文档地址:Util
util.promisify用于将基于回调的异步函数转换为返回 Promise 的异步函数
import { exec } from 'node:child_process'
import util from 'node:util'
const execPromise = util.promisify(exec)
execPromise('node -v').then(res=>{
console.log(res,'res')
}).catch(err=>{
console.log(err,'err')
})
util.callbackif将promise类型的API变成回调函数,与上面相反
import util from 'node:util'
const fn = (type) => {
if(type == 1){
return Promise.resolve('test')
}
return Promise.reject('error')
}
const callback = util.callbackify(fn)
callback(1222,(err,val)=>{
console.log(err,val)
})
fs 模块
fs 模块是文件系统模块的缩写,提供了与文件系统进行交互的各种功能,比如读取文件、写入文件、更改文件权限、创建目录等操作
先说 fs 多种策略
import fs from 'node:fs'
import fs2 from 'node:fs/promises'
//读取文件
fs2.readFile('./index.txt').then(result => {
console.log(result.toString())
})
fs.readFile('./index.txt', (err, data) => {
if (err) {
return err
}
console.log(data.toString())
})
let txt = fs.readFileSync('./index.txt')
console.log(txt.toString())
- fs 支持同步和异步两种模式,增加了
Syncfs 就会采用同步的方式运行代码,会阻塞下面的代码,不加Sync就是异步的模式不会阻塞 - fs 新增了promise版本,只需要在引入包后面增加/promise即可,fs便可支持promise回调
- fs 返回的是一个buffer二进制数据,通过
toString()进行转化
readFile()读文件,接收三个参数,文件路径,配置项,回调函数(同步、promise除外)createReadStream()可读流读取,适合大文件的读取
const readStream = fs.createReadStream('./index.txt',{
encoding:"utf8"
})
readStream.on('data',(chunk)=>{
console.log(chunk)
})
readStream.on('end',()=>{
console.log('close')
})
recursive()创建文件夹
// 开启 recursive,递归创建
fs.mkdir('path/test/ccc', { recursive: true },(err)=>{
})
fs.mkdir('/test' ,(err)=>{
})
rm()删除文件夹renameSync()重命名文件
fs.renameSync('./test.txt','./test2.txt')
watch()监听文件变化
fs.watch('./test2.txt',(event,filename)=>{
console.log(event,filename)
})
writeFile()写文件appendFileSync()第二种追加内容的方式
const fs = require('node:fs')
fs.writeFileSync('index.txt', '\nvue之父\n鱿鱼须',{
flag: 'a'
})
fs.appendFileSync('index.txt', '\nunshift创始人\n麒麟哥')
createWriteStream()可写流,打开一个通道,可以一直写入数据,用于处理大量的数据写入,写入完成之后调用 end 关闭可写流,监听 finish 事件写入完成
const fs = require('node:fs')
let verse = [
'待到秋来九月八',
'我花开后百花杀',
'冲天香阵透长安',
'满城尽带黄金甲'
]
let writeStream = fs.createWriteStream('index.txt')
verse.forEach(item => {
writeStream.write(item + '\n')
})
writeStream.end()
writeStream.on('finish',()=>{
console.log('写入完成')
})
- 硬链接与软链接
fs.linkSync('./index.txt', './index2.txt') //硬链接
fs.symlinkSync('./index.txt', './index3.txt' ,"file") //软连接
crypto 模块
crypto 是一个密码学模块,是为了提供通用的加密和哈喜算法
- 对称加密
- 非对称加密
- 哈希函数
const crypto = require('node:crypto');
// 要计算哈希的数据
let text = '123456';
// 创建哈希对象,并使用 MD5 算法,也有 sha256 算法
const hash = crypto.createHash('md5');
// 更新哈希对象的数据
hash.update(text);
// 计算哈希值,并以十六进制字符串形式输出
const hashValue = hash.digest('hex');
console.log('Hash:', hashValue);
- 哈希函数的特点:固定长度输出、不可逆性、唯一性
- 使用场景一般用于避免密码明文传输,使用md5或者sha256加密;验证文件完整性,读取文件内容生成md5 如果前端上传的md5和后端的读取文件内部的md5匹配说明文件是完整的
zlib 模块
zlib 模块提供了对数据压缩和解压缩的功能,以便在应用程序中减少数据的传输大小和提高性能。该模块支持多种压缩算法,包括 Deflate、Gzip 和 Raw Deflate
zlib 模块主要作用是数据压缩、数据解压缩、流压缩、压缩格式支持
- 使用 Gzip 压缩算法
// 引入所需的模块
const zlib = require('zlib'); // zlib 模块提供数据压缩和解压缩功能
const fs = require('node:fs'); // 引入 Node.js 的 fs 模块用于文件操作
// 创建可读流和可写流
const readStream = fs.createReadStream('index.txt'); // 创建可读流,读取名为 index.txt 的文件
const writeStream = fs.createWriteStream('index.txt.gz'); // 创建可写流,将压缩后的数据写入 index.txt.gz 文件
// 使用管道将可读流中的数据通过 Gzip 压缩,再通过管道传输到可写流中进行写入
readStream.pipe(zlib.createGzip()).pipe(writeStream)
// 解压缩
const readStream = fs.createReadStream('index.txt.gz')
const writeStream = fs.createWriteStream('index2.txt')
readStream.pipe(zlib.createGunzip()).pipe(writeStream)
- 使用 deflate 压缩算法
const readStream = fs.createReadStream('index.txt'); // 创建可读流,读取名为 index.txt 的文件
const writeStream = fs.createWriteStream('index.txt.deflate'); // 创建可写流,将压缩后的数据写入 index.txt.deflate 文件
readStream.pipe(zlib.createDeflate()).pipe(writeStream);
// 解压缩
const readStream = fs.createReadStream('index.txt.deflate')
const writeStream = fs.createWriteStream('index3.txt')
readStream.pipe(zlib.createInflate()).pipe(writeStream)
- http 请求压缩demo
const zlib = require('zlib');
const http = require('node:http');
const server = http.createServer((req,res)=>{
const txt = '小满zs'.repeat(1000);
// res.setHeader('Content-Encoding','gzip')
res.setHeader('Content-Encoding','deflate')
res.setHeader('Content-type','text/plan;charset=utf-8')
// const result = zlib.gzipSync(txt);
const result = zlib.deflateSync(txt);
res.end(result)
})
server.listen(3000)