node.js笔记

node.js概览

课程内容

黑马nodejs1686091278063

尚硅谷nodejs 18h1686091493554

node.js 是什么

nodejs可以看作是一个让js代码脱离浏览器的软件

node.js 作用

  1. web服务器

  2. 工具类 -webpack

  3. 桌面软件 -基于nodejs的electron 可以开发桌面软件 vscode

node.js 组成

nodejs里不能用BOM和DOM ajax history navigator location, 可以用console和定时器api

顶级对象不是window而是global globalThis(ES2020)

1686094560724

1686094570737

Buffer

创建buffer

1
2
3
4
5
6
7
8
9
//1. alloc 数据清零
let buf = Buffer.alloc(10);
console.log(buf);
//2. allocUnsafe 不清零 速度快
let buf_2 = Buffer.allocUnsafe(10);
console.log(buf_2);
//3. from
let buf_3 = Buffer.from('hello');
console.log(buf_3);

操作buffer

1
2
// 从数组转换到字符串
let buf_4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]); console.log(buf_4.toString())
1
2
3
4
5
6
//读取
console.log(buf_3[0].toString(2)); // 01101000, 参数2表示二进制
//修改
buf_3[0] = 97;
//查看字符串结果
console.log(buf_3.toString())

Note:

  1. 如果修改的数值超过 255 ,则超过 8 位数据会被舍弃
  2. 一个 utf-8 的字符 一般 占 3 个字节

fs模块

概览

本章节会介绍如下几个操作:

  1. 文件写入
  2. 文件读取
  3. 文件移动与重命名
  4. 文件删除
  5. 文件夹操作
  6. 查看资源状态

写入

说明 方法
异步写入 writeFile
同步写入 writeFileSync
追加写入 appendFile / appendFileSync
流式写入 createWriteStream
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//1. 导入fs模块
const fs = require('fs');

//2.1 写入文件(异步
fs.writeFile('./座右铭.txt', '三人行,必有我师焉。', err => {
//如果写入失败,则回调函数调用时,会传入错误对象,如写入成功,会传入 null
if(err){
console.log(err);
return;
}
console.log('写入成功');
});

//2.2 写入文件(同步
try{
fs.writeFileSync('./座右铭.txt', '三人行,必有我师焉。');
}catch(e){
console.log(e);
}

//2.3 写入文件(追加
fs.appendFile('./座右铭.txt','择其善者而从之,其不善者而改之。', err => {
if(err) throw err;
console.log('追加成功')
});
fs.appendFileSync('./座右铭.txt','\r\n温故而知新, 可以为师矣');
//writeFile实现追加写入
fs.writeFile('./座右铭.txt', '三人行,必有我师焉。', {flag:'a'}err => {
//如果写入失败,则回调函数调用时,会传入错误对象,如写入成功,会传入 null
if(err){
console.log(err);
return;
}
console.log('写入成功');
});

//2.4 写入文件(流式
//创建写入流对象
let ws = fs.createWriteStream('./观书有感.txt');
ws.write('半亩方塘一鉴开\r\n');
ws.write('天光云影共徘徊\r\n');
ws.write('问渠那得清如许\r\n');
ws.write('为有源头活水来\r\n');
ws.end();
/* 程序打开一个文件是需要消耗资源的 ,流式写入可以减少打开关闭文件的次数。
* 流式写入方式适用于 大文件写入或者频繁写入 的场景, writeFile 适合于 写入频率较低的场景*/

写入文件的场景

文件写入 在计算机中是一个非常常见的操作,下面的场景都用到了文件写入

  • 下载文件

  • 安装软件

  • 保存程序日志,如 Git 编辑器保存文件

  • 视频录制

当需要持久化保存数据 的时候,应该想到文件写入

读取

Method details
readFile 异步读取
readFileSync 同步读取
createReadStream 流式读取

异步读取

语法:fs.readFile(path[, options], callback)

1
2
3
4
5
6
7
8
9
10
11
//导入 fs 模块
const fs = require('fs');
fs.readFile('./座右铭.txt', (err, data) => {
if(err) throw err;
console.log(data);
});
fs.readFile('./座右铭.txt', 'utf-8',(err, data) => {
if(err) throw err;
console.log(data);
});

同步读取

语法: fs.readFileSync(path[, options])

返回值: string | Buffer

1
2
let data = fs.readFileSync('./座右铭.txt');
let data2 = fs.readFileSync('./座右铭.txt', 'utf-8')

流式读取

语法:fs.createReadStream(path[, options])

返回值: Object

1
2
3
4
5
6
7
8
9
10
11
12
13
//创建读取流对象
let rs = fs.createReadStream('./观书有感.txt');
//每次取出 64k 数据后执行一次 data 回调
//绑定data事件
rs.on('data', data => {
console.log(data);
console.log(data.length);
});
//读取完毕后, 执行 end 回调
//绑定end事件,可选事件
rs.on('end', () => {
console.log('读取完成')
})

应用场景

  • 电脑开机
  • 程序运行
  • 编辑器打开文件
  • 查看图片
  • 播放视频
  • 播放音乐
  • Git 查看日志
  • 上传文件
  • 查看聊天记录

复制

  1. 同步方式
  2. 流式方式

重命名和移动

移动可以用重命名实现

1
2
3
4
5
fs.rename('./观书有感.txt', './论语/观书有感.txt', (err) =>{
if(err) throw err;
console.log('移动完成')
});
fs.renameSync('./座右铭.txt', './论语/我的座右铭.txt');

删除

1
2
3
4
5
6
7
8
9
10
11
12
const fs = require('fs');
fs.unlink('./test.txt', err => {
if(err) throw err;
console.log('删除成功');
});
fs.unlinkSync('./test2.txt');

// 调用rm方法 14.4
fs.rm('./test.txt', err => {
if(err) throw err;
console.log('删除成功');
});

文件夹操作

方法 说明
mkdir / mkdirSync 创建文件夹
readdir / readdirSync 读取文件夹
rmdir / rmdirSync 删除文件夹

mkdir创建文件夹

语法: fs.mkdir(path[, options], callback)

fs.mkdirSync(path[, options])

1
2
3
4
5
6
7
8
9
10
11
12
//异步创建文件夹
fs.mkdir('./page', err => {
if(err) throw err;
console.log('创建成功');
});
//递归异步创建
fs.mkdir('./1/2/3', {recursive: true}, err => {
if(err) throw err;
console.log('递归创建成功');
});
//递归同步创建文件夹
fs.mkdirSync('./x/y/z', {recursive: true});

readdir 读取文件夹

语法:

fs.readdir(path[, options], callback)

fs.readdirSync(path[, options])

1
2
3
4
5
6
7
8
//异步读取
fs.readdir('./论语', (err, data) => {
if(err) throw err;
console.log(data);
});
//同步读取
let data = fs.readdirSync('./论语');
console.log(data);

rmdir 删除文件夹

语法:fs.rmdir(path[, options], callback)

fs.rmdirSync(path[, options])

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//异步删除文件夹(DeprecationWarning
fs.rmdir('./page', err => {
if(err) throw err;
console.log('删除成功');
});
//异步递归删除文件夹
fs.rmdir('./1', {recursive: true}, err => {
if(err) {
console.log(err);
}
console.log('递归删除')
});
//同步递归删除文件夹
fs.rmdirSync('./x', {recursive: true})

查看资源状态

语法:

fs.stat(path[, options], callback)

fs.statSync(path[, options])

1
2
3
4
5
6
7
8
//异步获取状态
fs.stat('./data.txt', (err, data) => {
if(err) throw err;
console.log(data);
});
//同步获取状态
let data = fs.statSync('./data.txt');

结果值对象结构:

  • size 文件体积
  • birthtime 创建时间
  • mtime 最后修改时间
  • isFile 检测是否为文件
  • isDirectory 检测是否为文件夹
  • ….

相对路径问题

相对路径参照物:命令行的工作目录

__dirname

__dirname 与 require 类似,都是 Node.js 环境中的’全局’变量 __dirname 保存着 当前文件所在目录的绝对路径 ,可以使用 __dirname 与文件名拼接成绝对路径

1
2
let data = fs.readFileSync(__dirname + '/data.txt'); 
console.log(data)

使用 fs 模块的时候,尽量使用 __dirname 将路径转化为绝对路径,这样可以避免相对路径产生的 Bug

练习:批量重命名

1.个位数前面添加0

1686104295546

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//导入 fs 模块
const fs = require('fs');

//读取 code 文件夹
const files = fs.readdirSync('./code');

//遍历数组
files.forEach(item => {
//拆分文件名
let data = item.split('-');
let [num, name] = data;
//判断
if(Number(num) < 10){
num = '0' + num;
}
//创建新的文件名
let newName = num + '-' + name;
//重命名
fs.renameSync(`./code/${item}`, `./code/${newName}`);
})

2.删掉02,让后面的文件名字中的数字减1

1686104349502

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//导入 fs 模块
const fs = require('fs');

//读取 code 文件夹
const files = fs.readdirSync('./code');

//遍历数组
files.forEach((item, index) => {
//拆分
let [num, name] = item.split('-');
//index 自增
index++;
//判断
index = index < 10 ? '0' + index : index;
//拼接新的名字
let newName = index + '-' + name;
//移动文件
fs.renameSync(`./code/${item}`, `./code/${newName}`);
});

path模块

API 说明
path.resolve 拼接规范的绝对路径 常用
path.sep 获取操作系统的路径分隔符
path.parse 解析路径并返回对象
path.basename 获取路径的基础名称 (123.txt
path.dirname 获取路径的目录名
path.extname 获得路径的扩展名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const path = require('path');
//拼接绝对路径
console.log(path.resolve(__dirname, 'test')); // resolve 第二个参数一定是相对路径
-----=2p获取路径分隔符
console.log(path.sep);
//解析路径
let pathname = 'D:/program file/nodejs/node.exe';
console.log(path.parse(pathname));
//获取路径基础名称
console.log(path.basename(pathname));
//获取路径的目录名
console.log(path.dirname(pathname));
//获取路径的扩展名
console.log(path.extname(pathname));

HTTP协议

超文本传输协议


node.js笔记
http://example.com/2023/12/26/node.js笔记/
作者
John Doe
发布于
2023年12月26日
许可协议