Node高级进阶学习笔记----Node中的fs-event-buffer等模块

本文详细介绍了Node.js的工作原理,包括V8引擎如何通过Node.js的Bindings将JavaScript任务交给Libuv事件循环处理,以及文件系统API的异步操作模式,如fs模块的同步/异步读写和events模块的事件监听机制。此外,还讨论了Buffer对象在二进制数据处理中的应用。
摘要由CSDN通过智能技术生成

1、Nodejs介绍

--我们编写的JavaScript代码会经过V8引擎,再通过Node.js的Bindings,把任务放到Libuv的事件循环中;

--libuv是使用C语言编写的库

--libuv提供了事件循环、文件系统读写、网络IO、线程池等等内容

这是一张Node.js官方架构图:

架构图解释:编写代码的位置在application,运行node之后V8 JavaScript引擎会通过Node.js的bindings将JavaScript的任务放到libuv的事件队列中,并通过事件循环放进任务队列中。libuv可以理解为是连接V8引擎和系统调用之间的桥梁 。将一些不能被操作系统直接识别的操作转换成一些系统调用。

(解释为个人理解,如有错误多谢指出!)

Node文件系统的API十分多,但是这些API大多数都提供三种操作方式:

(1)同步操作文件:代码会被阻塞,不会继续执行

(2)一步回到操作文件:代码不会被阻塞,需要传入回调函数,当获取到结果时,回调函数被执行

(3)异步Promise操作文件:代码不会被阻塞,通过fs.promises调用方法操作,会返回一个Promise,可以通过then、catch进行处理

2、内置模块fs

(1)文件读取

①同步读取:

//1.同步读取
const res1 = fs.readFileSync('./demo.txt', {
    // 设置读取文件的格式 utf-8的格式
    encoding: 'utf8'
})
console.log(res1);

②异步读取

fs.readFile('./demo.txt', {
    // 设置读取文件的格式 utf-8的格式
    encoding: 'utf8'
}, (err, res) => {
    if (err) {
        console.log('读取有问题');
        return;
    }

    console.log('读取文件结果:', res);
})
console.log('后续的代码2');

③异步读取--promise

// 3.异步读取--promise
fs.promises.readFile('./demo.txt', {
    encoding: 'utf8'
}).then(res => {
    console.log(res);
}).catch(err => {
    console.log(err);
})

encoding选项:现在基本都是使用utf-8编码。如果不填写encoding,返回的结果是Buffer

(2)文件写入

const fs = require('fs');

// 1.有一段客户端传递过来的内容
const content = '123';

// 2.文件的写入操作
fs.writeFile('./write.txt', content, {
    encoding: 'utf8',
    flags: 'w',
}, (err) => {
    if (err) {
        console.log('文件写入失败');
    } else {
        console.log('文件写入成功');
    }
})

(3)创建文件夹

const fs = require('fs');

//创建文件夹 directory
fs.mkdir('./why', (err) => {
    console.log(err);
})

(4)获取文件夹内容

const fs = require('fs');

// 读取文件夹
// 1.读取文件夹 获取到文件夹中文件的字符串
fs.readdir('./why', (err, file) => {
    console.log(file);
})

获取文件夹可以通过递归的办法获取:

const fs = require('fs');

function getDir(path) {
    fs.readdir('./why', {
        withFileTypes: true
    }, (err, file) => {
        file.forEach(item => {
            if (item.isDirectory()) {
                console.log('item是一个文件夹', item.name);

                fs.readdir(`${path}/${item.name}`, {
                    withFileTypes: true
                }, (err, file) => {
                    console.log(file);
                })
            } else {
                console.log('item是一个文件', item.name);
            }
        })
    })
}

getDir('./why')

3、events模块

个人理解:events可以理解为等同于eventBus(事件总站)

其实events模块就是监听一个事件,并且监听到事件发生会有回调函数发生调用(Node中核心API都是基于异步事件驱动的,其实就是这个意思)

events中的监听事件、发射事件、取消事件监听

//events模块中的事件总线  引入的是一个类
const EventEmitter = require('events');

//创建EventEmitter实例
const emitter = new EventEmitter();

function handleFnWhy() {
    console.log('监听why事件');
}
// 监听事件
emitter.on('why', handleFnWhy)

// 发射事件
emitter.emit('why')

//取消事件监听,后面要加上取消监听的事件的回调函数
emitter.off('why', handleFnWhy)

另外,events监听事件触发回调函数可以传递参数

function handleFnWhy(name, age, height) {
    console.log('监听why事件', name, age, height);
}
// 监听事件/发射事件
emitter.on('why', handleFnWhy)

// 发射事件
emitter.emit('why', 'coderwhy', 18, 1.88)

//取消事件监听,后面要加上取消监听的事件的回调函数
emitter.off('why', handleFnWhy)

4、Buffer

Buffer是一个存储二进制的数组

一个字节为了可以在计算机更好地表示,一般都转换成十六进制展示,Buffer也是如此

创建Buffer:

// 1.创建Buffer
const buf2 = Buffer.from('why');
console.log(buf2);

// 2.创建Buffer(字符串中有中文)
const buf3 = Buffer.from('你好啊');
console.log(buf3);
// 转化回字符串
console.log(buf3.toString());

从文件中读取Buffer:

const fs = require('fs');

// 1.从文件中读取Buffer
fs.readFile('./aaa.txt', (error, data) => {
    console.log(data);
})

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值