Node.js-fs模块

534 阅读12分钟

Node.js

Node.js的定义

Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境

名词解释

  • chrome V8引擎: 在chrome浏览器用来解析和执行js代码的工具;
  • 运行时:理解为一个容器,用来运行代码的环境;这个环境让JS有读写文件,操作数据库,开启web服务器等能力 注意:Node.js 只是JS的服务端运行环境,不是一门语言(不需要学习新语言),而只需要学习它里面新的Api

1651991776496.png

中文网 :
Nodejs.cn/
nodejs.org/zh-cn/

Node.js作用

浏览器是JS的前端运行环境

1651991849272

Node.js是JS的后端运行环境

1651991870719

※ 延伸前端工程师的能力范围,探究后端工程师的工作内容

Node.js环境与浏览器环境的区别

1651992795054.png

在浏览器端:js由三部分组成:ECMAScript + BOM + DOM

在NoeJS端:由ECMAScript + 内置模块(fs, http, path等) + 第三方模块(别人开发的模块)

注意:NodeJS中没有DOM,也没有BOM,也没有window对象。

浏览器是JS的前端运行环境,Node.js是JS的后端运行环境

下载和安装Node.js环境

下载对应版本的安装包(nodejs.org/zh-cn/)

注意:

1.win10 可以随意安装任何版本的Node

2.但是win7只能安装12及其以下的版本Node 以往版本下载

1651992056637

点击下载到的安装包,一路下一步默认安装

注意:

1.不能安装到中文目录如d:/软件,建议一直点击next即可

2.安装完成之后, 它不会在桌面出现快捷图标

安装

找到你下载的安装包,

image-20210317215248242

  1. 双击安装文件开始安装(不同系统选择对应的安装文件)

  2. 傻瓜式安装,一路 'next' 即可

注意:

  • 建议安装目录所使用英文路径 (不要安装在类似于 d:/软件/node)
  • 安装完成之后, 它不会在桌面出现快捷图标

打开小黑窗输入 node -v 能看到版本号表示安装成功

在任意文件夹中最上方的路径中输入cmd后回车即可打开

Node.js分为长期支持版和最新版本 ,我们推荐使用长期支持版,因为它最稳定,最新版包含新功能,可用于研究,它不稳定

Node.js安装目录不能有中文或特殊字符,建议一路点击next直到安装完毕

查看Node.js版本命令:node -v

小黑窗打开方式

小黑窗:是我们给 命令行工具 起的一个昵称

window系统打开小黑窗的几种方式

按 windows + R 运行窗口中输入cmd 回车即可打开

在任意目录的最上方路径输入框中输入 cmd 回车接口打开 (推荐)

在任意目录中按住 shift键 + 鼠标右键后在弹出菜单中点击 在此处打开命令窗口 或 在此处打开PowerShell窗口即可打开

在VSCode中,任意一个js文件上鼠标右键,选择在 集成终端中打开

苹果电脑操作: jingyan.baidu.com/article/375…

在Node环境下运行js代码

vscode中新建一个01nodejs执行体验.js,console.log()输出一段文本, 利用node执行后看到输出表示执行成功

1651992287618

1651993101514

步骤:

新建01nodejs执行体验.js

编写代码:console.log('nodejs执行输出啦');

打开小黑窗,输入 node 01nodejs执行体验.js 回车看结果

注意:node后面要加空格,格式: node 空格 要执行的js文件

在Node环境下运行各种js语法

步骤:

新建02node执行各种js语法.js

在文件中定义 let obj ={age:20}; let arr = [1,2,3]; node执行后打印obj和arr看看结果(能正常执行)

在文件中编写 if(1==1) {} else {} node执行后打印结果(能正常执行)

注意:node后面要加空格,格式: node 空格 要执行的js文件

1651993481597

在文件中编写 alert(1)node执行时时会报错(alert is not defined)表示node环境中没有window不能操作dom

在文件中编写 while(true){console.log(1);}node执行后会一直打印1,此时该如何停止呢?在小黑窗中按 ctrl + c 终止

1651993834176

学习常用的命令及按键

命令及键盘按键

1651993885168

复制和粘贴

在小黑窗中复制内容:选中内容,再点鼠标右键

把粘贴板中的内容复制到小黑窗: 直接在小黑窗点鼠标右键

核心模块-文件读写fs

Node中的模块分类

核心模块

​ 就是nodejs自带的模块,在安装完nodejs之后,就可以任意使用啦。相当于学习js时使用的Math对象一样

自定义模块

​ 程序员自己写的模块。相当于我们在学习js时的自定义函数

第三方包

​ 其他程序员写好的模块,nodejs生态提供了一个专门的工具npm来管理第三方模块,例如我们前面学习的echarts等

nodejs官网查询核心模块

nodeapi官网:nodejs.org/dist/latest…

只要在官网中能查到的模块都是nodejs的核心模块

1651994134548.png

使用require导入模块

语法: const 变量名(自己随意取) = require('核心模块名');

建议:变量名 跟 模块名保持同名

const fs = require('fs')
const fs = require('fs')

console.log('测试1');
console.log('测试2');
console.log('测试3');
console.log('fs', fs);
// debugger // 打断点

// F5  启动调试 ->  选择 Node
//  Shift + F5 停止调试
//  Ctrl + Shift + Y 调试控制台

如果没有打断点 调试之后 fs模块的输出效果是以下示例

1652064324189

打断点之后才能像浏览器控制台看到的一样

1652064439233.png

例如:导入fs模块和Path核心模块的代码

1651996856406

fs.readFile异步读取文件内容

同步与异步的概念理解

同步:

多个功能按先后顺序执行,后面任务等待前面任务执行完毕后才会执行。

如平常大家讨论问题时说:让我说完,意思是说我说完你再说。

优缺点:如果前面任务执行太久会阻止后面任务的执行,降低程序执行性能,造成用户体验差,
优点是编程方式简单,便于理解执行过程。

异步:

和同步相反,也就是在发出一个功能调用时,不管没有没得到结果,都继续往下执行。 就像两个人吵架一样,各说各的,不管对方有没有说完。

优缺点:不会造成阻塞,提升了程序执行性能,用户体验好,
缺点是编程方式复杂,执行过程理解难度较大,会形成回调函数的嵌套。

异步的表现形式:以一个回调函数的方式来实现异步任务的执行

1651997102789

fs.readFile异步读取文件基本写法

语法:

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

参数:

  • path,读取文件的路径(相对路径或绝对路径)
  • options:读取文件的参数配置,通常用一个utf8字符串表示即可
  • callback:读取完毕的回调函数(err,data)=>{ }

场景:在一个js文件中编写代码,读取同级目录下的1.txt文件中的内容打印到小黑窗上

步骤:

  1. 在day01文件夹下 创建 /异步读取文件/rd.js 和 /异步读取文件/1.txt两个文件
  2. 在1.txt中随便输入一个字符串内容
  3. 在rd.js中导入fs核心模块 const fs = require(‘fs’)
  4. fs.readFile(‘./1.txt’,’utf8’,(err,data)=>{ consloe.log(data); })
  5. 进入异步读取文件目录打开小黑窗,执行 node rd.js 看结果

注意:读取文本内容文件时,utf8参数要加上,不然打印出来的是一个Buffer二进制内容

// 导入fs模块
const fs = require('fs')
// 调用 fs.readFile() 方法读取文件
// 参数1:读取文件的存放路径
// 参数2:读取文件采用的编码格式 一般默认指定 utf8
// 参数3:回调函数,拿到读取失败和成功的结果 err datastr
fs.readFile('./123.txt', 'utf8', function(err, dataStr){
    // 打印失败的结果
    // 读取成功 则err的值为null 失败则为错误对象,datastr的值为undefined
    console.log(err);
    console.log('---------');
    // 打印成功的结果
    console.log(dataStr);
})

1652066470035

文件错误的情况下

1652066531714

const fs = require('fs')

fs.readFile('./123.txt', (err, data) => {
    // typeof 检测类型
    console.log('err', typeof err)
    // 加 toString() 可以输出里面的内容
    console.log('data', data.toString())
})

1652065885765.png

fs.readFileSync同步读取文件写法

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

参数:

  • path,读取文件的路径(相对路径或绝对路径)
  • options:读取文件的参数配置,通常用一个utf8字符串表示即可
const fs = require('fs')


// Sync 同步的意思 按书写顺序运行
console.log(111)

const data = fs.readFileSync('./123.txt')
console.log('文本',data.toString());

const data2 = fs.readFileSync('./avatar_1.png')
console.log(333);

console.log('图片', data2);

1652070366781

同步读取文件处理错误

try catch语法:

try{ 放有可能出错的代码 } catch(err){ 报错后执行的代码,通常是输出错误 }

处理同步读取文件的错误

// 捕获同步读取文件的错误
const fs = require('fs')
try {
    // 正常业务代码
    console.log(123);
    const data = fs.readFileSync('./123.txt')
    console.log(456);
} catch (error) {
    // 如果代码出错 catch会捕获错误
    console.log('读取文件失败');
}

小结

同步读取文件的方法名叫 readFileSync

同步读取文件的内容如何获得? 直接用变量接收readFileSync的返回值

同步代码的错误处理使用try{}catch(){}处理,那么try中写什么代码 正常的逻辑的代码

catch中的代码是如何触发执行的 try中的代码出错后就会触发catch中的代码

fs核心模块写入文件

向指定文件中写入内容

fs.writeFile( ) 的语法格式

语法:

fs.writeFile(path,data[, options], callback)

特点:writeFile方法是覆盖式写入,后面的内容会将前面的内容覆盖

参数:

  • path,被写入文件的路径(相对路径或绝对路径)
  • data,要写入的内容,字符串格式
  • options:写入文件的参数配置,默认是utf8编码
  • callback:写入完毕的回调函数(err)=>{}

fs.writeFile异步写入内容到文件

场景:在一个js文件中编写代码,将一段文本写入到同级目录下的1.txt文件中

步骤:

  1. 在day01文件夹下 创建 /异步覆盖写入文件/wd.js 和 /异步覆盖写入文件/1.txt两个文件
  2. 在wd.js中导入fs核心模块 const fs = require(‘fs’)
  3. fs.writeFile(‘./1.txt’,’白日依山尽’,’utf8’,(err)=>{ consloe.log(‘写入成功’); })
  4. 进入异步覆盖写入文件目录打开小黑窗,执行 node wd.js 看结果
const fs = require('fs')

fs.writeFile('./133.txt', '6666', err => {
    // 如果没有错误 err 的值为 null
    if(err) return console.log('写入错误')
    console.log('写入成功');
})
// 1、 覆盖写入  会覆盖原有的内容
// 2、 如果文件不存在会尝试自动创建文件
// 3、如果写入的路径是不存在的盘符 就会写入错误   比如  z: ./133.txt  不存在的盘符

异步写入对象数据格式

const fs = require('fs')

const arr = [ { id: 1 }, { id: 2 }]

/* 
    注意事项:
    fs.writeFile()  第二个参数的格式要求为字符串
    JSON.stringify()  把对象转换成JSON字符串
*/
fs.writeFile('./09-data.json', JSON.stringify(arr), err => {
    if(err) return console.log('写入错误')
    console.log('写入成功');
})

1652081380423

对json数据进行操作

创建一个json文件 写入一些对象

使用读写的功能,在json数据里新增一条对象

const fs = require('fs')
const obj = {name:"赵玉真"}
// 1、读取文件
fs.readFile('./09-data.json', (err, data) => {
    // 2、读取失败
    if(err) return console.log('读取失败');
    // 3.读取成功 把字符串转为数组
    const arr = JSON.parse(data.toString())
    // 4、追加一条数据带数组中 (内存中追加)
    arr.push(obj)
    // 5、 写入文件  注意参数2需要转字符串
    fs.writeFile('./09-data.json', JSON.stringify(arr), err => {
        // 写入成功或失败提示
        if(err) return console.log('写入错误');
        console.log('写入成功');
    })
})
const fs = require('fs')
const obj = {name:"李寒衣",belong:"雪月城",designation: "雪月剑仙"}
// 1、读取文件
fs.readFile('./09-data.json', (err, data) => {
    // 2、读取失败
    if(err) return console.log('读取失败');
    // 3.读取成功 把字符串转为数组
    const arr = JSON.parse(data.toString())
    // 4、追加一条数据带数组中 (内存中追加)
    arr.push(obj)
    // 5、 写入文件  注意参数2需要转字符串
    fs.writeFile('./09-data.json', JSON.stringify(arr), err => {
        // 写入成功或失败提示
        if(err) return console.log('写入错误');
        console.log('写入成功');
    })
})

1652084630230.png

fs.writeFileSync同步写入内容

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

特点:writeFile方法是覆盖式写入,后面的内容会将前面的内容覆盖

参数:

  • path,被写入文件的路径(相对路径或绝对路径)
  • data,要写入的内容,字符串格式
  • options:写入文件的参数配置,默认是utf8编码
const fs = require('fs')

try {
    fs.writeFileSync('./123.txt', '准备下班')
    console.log('写入成功');
} catch (error) {
    console.log('写入失败')
}

少用

异步读取文件处理错误

(err,data)=>{ } 中有两个参数

参数1:err代表读取文件出错后的错误对象
参数2data代表读取文件成功后的内容,如果读取失败则data的值为为undefined

err参数特点:

如果文件读取成功则err为null,

如果读取失败则err存储的具体的错误信息对象

通过如下if判断来处理错误

1651998205426

练习小案例

fs模块读写文件

const fs = require('fs')
const obj = {name:"司马长空",belong:"雪月城",designation: "枪仙"}
// 1、读取文件
fs.readFile('./09-data.json', (err, data) => {
    // 2、读取失败
    if(err) return console.log('读取失败');
    // 3.读取成功 把字符串转为数组
    const arr = JSON.parse(data.toString())
    // 4、追加一条数据带数组中 (内存中追加)
    arr.push(obj)
    // 5、 写入文件  注意参数2需要转字符串
    fs.writeFile('./09-data.json', JSON.stringify(arr), err => {
        // 写入成功或失败提示
        if(err) return console.log('写入错误');
        console.log('写入成功');
    })
})

图片复制案例

const fs = require('fs')
// 读取图片
fs.readFile('./太阳系.jpg', (err, data) => {
    if (err) return console.log('写入失败');
    // 读取成功
    if (data) {
        // 读取成功同步写入空的jpg文件 复制
        fs.writeFileSync('./空.jpg', data)
        console.log('写入成功');
    }
})

附:fs模块中的常用方法

API作用备注
fs.access(path, callback)判断路径是否存在
fs.appendFile(file, data, callback)向文件中追加内容
fs.copyFile(src, callback)复制文件
fs.mkdir(path, callback)创建目录
fs.readDir(path, callback)读取目录列表
fs.rename(oldPath, newPath, callback)重命名文件/目录
fs.rmdir(path, callback)删除目录只能删除空目录
fs.stat(path, callback)获取文件/目录信息
fs.unlink(path, callback)删除文件
fs.watch(filename[, options][, listener])监视文件/目录
fs.watchFile(filename[, options], listener)监视文件
fs.existsSync(absolutePath)判断路径是否存在