跟着小满zs学 nodejs —— 总结篇(二)

1,907 阅读4分钟

小满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

  1. 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')
})
  1. 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 支持同步和异步两种模式,增加了Sync fs 就会采用同步的方式运行代码,会阻塞下面的代码,不加Sync就是异步的模式不会阻塞
  • fs 新增了promise版本,只需要在引入包后面增加/promise即可,fs便可支持promise回调
  • fs 返回的是一个buffer二进制数据,通过 toString()进行转化
  1. readFile()读文件,接收三个参数,文件路径,配置项,回调函数(同步、promise除外)
  2. createReadStream()可读流读取,适合大文件的读取
const readStream = fs.createReadStream('./index.txt',{
    encoding:"utf8"
})
readStream.on('data',(chunk)=>{
    console.log(chunk)
})
readStream.on('end',()=>{
    console.log('close')
})
  1. recursive()创建文件夹
// 开启 recursive,递归创建
fs.mkdir('path/test/ccc', { recursive: true },(err)=>{
})
fs.mkdir('/test' ,(err)=>{
})
  1. rm()删除文件夹
  2. renameSync()重命名文件
fs.renameSync('./test.txt','./test2.txt')
  1. watch()监听文件变化
fs.watch('./test2.txt',(event,filename)=>{
    console.log(event,filename)
})
  1. writeFile()写文件
  2. appendFileSync()第二种追加内容的方式
const fs = require('node:fs')

fs.writeFileSync('index.txt', '\nvue之父\n鱿鱼须',{
    flag: 'a'
})
fs.appendFileSync('index.txt', '\nunshift创始人\n麒麟哥')
  1. 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('写入完成')
})
  1. 硬链接与软链接
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);
  1. 哈希函数的特点:固定长度输出、不可逆性、唯一性
  2. 使用场景一般用于避免密码明文传输,使用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)