node.js概览
课程内容
黑马nodejs
尚硅谷nodejs 18h
node.js 是什么
nodejs可以看作是一个让js代码脱离浏览器的软件
node.js 作用
web服务器
工具类 -webpack
桌面软件 -基于nodejs的electron 可以开发桌面软件 vscode
node.js 组成
nodejs里不能用BOM和DOM ajax history navigator location, 可以用console和定时器api
顶级对象不是window而是global globalThis(ES2020)


Buffer
创建buffer
1 2 3 4 5 6 7 8 9
| let buf = Buffer.alloc(10); console.log(buf);
let buf_2 = Buffer.allocUnsafe(10); console.log(buf_2);
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));
buf_3[0] = 97;
console.log(buf_3.toString())
|
Note:
- 如果修改的数值超过 255 ,则超过 8 位数据会被舍弃
- 一个 utf-8 的字符 一般 占 3 个字节
fs模块
概览
本章节会介绍如下几个操作:
- 文件写入
- 文件读取
- 文件移动与重命名
- 文件删除
- 文件夹操作
- 查看资源状态
写入
| 说明 |
方法 |
| 异步写入 |
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
| const fs = require('fs');
fs.writeFile('./座右铭.txt', '三人行,必有我师焉。', err => { if(err){ console.log(err); return; } console.log('写入成功'); });
try{ fs.writeFileSync('./座右铭.txt', '三人行,必有我师焉。'); }catch(e){ console.log(e); }
fs.appendFile('./座右铭.txt','择其善者而从之,其不善者而改之。', err => { if(err) throw err; console.log('追加成功') }); fs.appendFileSync('./座右铭.txt','\r\n温故而知新, 可以为师矣');
fs.writeFile('./座右铭.txt', '三人行,必有我师焉。', {flag:'a'}err => { if(err){ console.log(err); return; } console.log('写入成功'); });
let ws = fs.createWriteStream('./观书有感.txt'); ws.write('半亩方塘一鉴开\r\n'); ws.write('天光云影共徘徊\r\n'); ws.write('问渠那得清如许\r\n'); ws.write('为有源头活水来\r\n'); ws.end();
|
写入文件的场景
文件写入 在计算机中是一个非常常见的操作,下面的场景都用到了文件写入
下载文件
安装软件
保存程序日志,如 Git 编辑器保存文件
视频录制
当需要持久化保存数据 的时候,应该想到文件写入
读取
| Method |
details |
| readFile |
异步读取 |
| readFileSync |
同步读取 |
| createReadStream |
流式读取 |
异步读取
语法:fs.readFile(path[, options], callback)
1 2 3 4 5 6 7 8 9 10 11
| 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');
rs.on('data', data => { console.log(data); console.log(data.length); });
rs.on('end', () => { console.log('读取完成') })
|
应用场景
- 电脑开机
- 程序运行
- 编辑器打开文件
- 查看图片
- 播放视频
- 播放音乐
- Git 查看日志
- 上传文件
- 查看聊天记录
复制
- 同步方式
- 流式方式
重命名和移动
移动可以用重命名实现
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');
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
| 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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| const fs = require('fs');
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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const fs = require('fs');
const files = fs.readdirSync('./code');
files.forEach((item, index) => { let [num, name] = item.split('-'); 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')); -----=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协议
超文本传输协议