【Node.js】笔记整理 2 - 常用模块

news/2024/2/29 2:42:51

写在最前:跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识,需要格外注重实战和官方技术文档,文档建议作为手册使用

系列文章

  • 【Node.js】笔记整理 1 - 基础知识
  • 【Node.js】笔记整理 2 - 常用模块
  • 【Node.js】笔记整理 3 - npm

本文目录

  • 系列文章
  • 1、 fs —— 文件模块
    • 文件写入
      • writeFile - 异步写入文件
        • weiteFileSync - 同步写入文件
        • appendFile / appendFileSync —— 追加写入
        • createWriteStream - 流式写入
    • 读取文件
      • readFile - 异步读取
      • readFileSync - 同步读取
      • createReadStream - 流式读取
    • fs模块实例
      • 流式复制文件
      • 文件重命名和移动
        • 文件删除
        • 文件夹操作
      • 查看文件资源状态
  • 2、path —— 路径模块
    • path.resolve —— 路径拼接
    • path.sep —— 获取当前操作系统的路径分隔符
    • path.parse —— 解析路径
  • 3、Http
    • IP和端口
    • http模块
      • http.createServer —— 创建http服务对象
      • server.listen —— 监听
      • 获取请求体的相关数据
      • 设置http相应报文
      • 网页资源加载过程
      • 网页引入外部资源
      • 静态与动态资源
      • 搭建静态资源服务
      • 网页URL的使用
      • mime类型
      • 乱码问题
      • 错误处理
      • GET 和 POST 的场景以及区别
  • 模块化
    • CommonJS模块化规范

1、 fs —— 文件模块

fs模块提供了对文件、文件夹操作的能力。在这个模块中,写入的数据如果想要换行,需要使用\r\n,而不是\n

另外请注意,读取到的都是Buffer,你需要按照文件的格式选择对应的方法将其转化为需要的数据,比如读取txt文件,你可以使用toString()进行转换

引入fs模块

const fs = require('fs')

文件写入

需要持久化保持数据时,除了直接存储在数据库,还有可以利用文件写入

writeFile - 异步写入文件

语法:fs.writeFile(file, data[, options], callback)

  • file: 写入的文件名
  • data: 写入文件的数据
  • options: 写入时给文件的选项配置
  • callback: 写入文件后的回调函数

示例:

const fs = require('fs')fs.writeFile('./hello.js', 'console.log('hello node')', (res) => {console.log(res)// 写入失败则res 为 Error对象, 成功则为null
})
weiteFileSync - 同步写入文件

语法:fs.writeFileSync(file, data[, options]), 注意没有回调函数

fs.writeFile('./hello.js', 'console.log('hello nodeSync')')
appendFile / appendFileSync —— 追加写入

追加写入时在指定文件末尾添加内容

语法: fs.appendFile(file, data[, options], callback)fs.appendFileSync(file, data[, options])

二者返回undefined

createWriteStream - 流式写入

优势:可以减少打开关闭文件的次数,适合大文件写入或者频繁写入,流式写入可以在这种场景下提高性能

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

  • path:文件路径
  • options:选项配置

返回值:Object

使用流式写入时,需要先和文件建立通道: const ws = createWriteStream('filePath')

然后可以使用ws.wirte(data)写入内容,文件内容写入完毕后,使用ws.close()关闭通道,通道关闭前都可以向对应文件中写入数据

const ws = fs.createWriteStream('filePath')// 流式写入数据
ws.write('hello world\r\n')// 关闭通道
ws.close()

读取文件

当需要读外部文件获取信息时候都要进行文件读取,比如读音乐、读视频、读系统文件等等

readFile - 异步读取

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

返回值:undefined

读取到的data是一个Buffer,需要进行处理

const fs = require('fs')fs.readFile('./hello.js', (err, data) => {if(err){// ...}// 读取到的是Buffer, 还需要转字符串if(data){data = data.toString()}
})

readFileSync - 同步读取

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

返回值: Buffer,读取结果

const fs = require('fs')let data = fs.readFileSync('./hello.js')
const fileInfo = data.toString()

createReadStream - 流式读取

同样的你需要建立一个通道, 创建读取流对象: const rs = fs.createReadStream(path[, options], callback)

  • 获取读取到的数据: rs.on('data', (chunk) => {}),绑定data事件, chunk是流式读取时每次读取到的Buffer块,通过length属性可以获取每个块的字节大小
  • 读取完毕时可触发回调:rs.on('end', () => {}),绑定end事件

fs模块实例

流式复制文件

非流式就是读完了然后写进一个新的,操作都简单就不用说了,这里主要记流式,边读边写。流式也是经常使用的方式,因为更适合读大文件的情景。并且对资源的利用更优

const rs = fs.createReadStream('./hello.js')
const ws = fs.createWriteStream('./hello_copy.js')rs.on('data', chunk => {ws.write(chunk)
})rs.on('end', () => {alert('文件复制完毕')
})

管道快速复制文件(不大的):

rs.pipe(ws)

文件重命名和移动

要用到fs模块提供的rename()API

语法:fs.rename(path, newPath, callback(err))

同步版本: fs.renameSync(path, newPath)

const fs = require('fs')fs.rename('./hello.js', './newName.js', err => {if(err){//...}else{//...}
})

通过上面的例子可以看到,这个API也可以用于移动文件

文件删除

要用到fs模块提供的unlinkunlinkSync

语法:unlink( path, callback(err) )

同步版类推

代码示例省略

node 14.4版本引入了新的删除文件API —— rmrmSync

语法:fs.rm( path. callback(err) )

文件夹操作
API功能
mkdir、mkdirSync创建文件夹
readdir、readdirSync读取文件夹
rmdir、rmdirSync (这两个api将来会被移除)、rm(建议使用)删除文件夹

1、创建文件夹

和linux命令名一样是mkdir

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

const fs = requrie('fs')fs.mkdir('./newFile.txt', err => {// ...
})// 递归创建
fs.mkdir('./a/b/c', { recursive: true }, err => {// ...
}

2、文件夹读取

语法:fs.readdir( path, callback( err, data ) )

fs.readdier('./hello.js', (err, data) => {if(err){//...}// 处理读取结果data
})

3、删除文件夹

语法:fs.rm( path, callback(err) )

递归删除: fs.rm( path, { } )

fs.rm('./a', { recursive: true }, err => {//...
})

查看文件资源状态

语法: fs.state( path, [, options], callback(err, data) )、同步版本fs.stateSync

data结构:

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

会用到的全局变量:

  • __dirname:可以获取其所在文件的所在目录的绝对路径,这可以避免工作目录变化的影响。
  • __filename:当前文件的绝对路径

2、path —— 路径模块

常用API:

API功能
path.resolve拼接规范的绝对路径
path.sep获取操作系统的路径分隔符
path.parse( filePath )解析路径并返回对象
path.basename( filePath )获取路径的基础名称
path.dirname( filePath )获取路径的目录名
path.extname( filePath )获取路径的扩展名

path.resolve —— 路径拼接

语法: path.resolve( 绝对路径, 相对路径 )

const path = require('path')let filePath = path.resolve(__dirname, './hello.js')
let filePath = path.resolve(__dirname, 'hello.js')  // 不写./也可以

path.sep —— 获取当前操作系统的路径分隔符

语法: path.sep

区别: window下返回值是\,Linux下结果是/

path.parse —— 解析路径

语法: path.parse( filePath )

返回值是一个Object:

  • root:根
  • dir:文件夹路径
  • base:文件
  • ext:文件类型
  • name:文件名

3、Http

Http报文相关在AJAX基础已经学了这里省略

IP和端口

去看计网

http模块

从这里开始,就是后端基础了,node后端需要借助这个http模块进行

const http = require('http')

http.createServer —— 创建http服务对象

语法: http.createServer( (request, response) => {} )

参数:

  • resquest:请求报文内容,包含请求体
  • response:响应报文, 对请求的响应信息在这里面进行配置
const server = http.createServer( (res, req) => {// ...response.end('响应结束')
} )

响应内容中文乱码的解决

在请求头中规定文本类型

const server = http.createServer( (res, req) => {// 设置接受的文本类型response.setHeader('Content-Type', 'text/html; charset=utf-8')response.end('响应结束')
} )

server.listen —— 监听

语法: server.listen( port, callback )

参数:

  • post: 端口号
  • callback:启动监听服务成功时的回调

http协议默认端口是80, https协议的默认端口是443,http服务开发常用端口有3000、8080、8090、9000等

获取请求体的相关数据

解义获取语法
method - 请求方法request.method
httpVersion - http协议版本号request.httpVersion
url - 请求路径request.url
url路径request(‘url’).parse(request.url).pathname
url查询字符串, 以此可以获取query参数request(‘url’).parse(request.url, true).query
header - 请求头request.headers
data - 请求体request.on(‘data’, (chunk) => {})、request.on(‘end’, ()=>{})

获取请求体的流程

const url = require('url')
const server = http.createServer( (req, res) => {// 获取请求方法let { method } = req// 解析urllet resUrl = new URL(req.url , ip)let pathName = resUrl.pathnamelet query = res.querylet body = ''// ... request.on('data', (chunk) => {body += chunk})request.on('end', () => {console.log(body)// 响应response.end(body)})
} )

设置http相应报文

作用语法
code - 设置响应状态码response.statusCode
message - 设置响应状态描述response.statusMessage
header - 响应头信息response.setHeader(‘头名’, ‘头值’)
data - 响应体,即后端返回给前端的前台需要的数据response.write(data)
response.end(‘end’)

对接过后端的应该可以很清晰看出来都是些什么作用,所以就直接写示例了

const server = http.createServer( (req, res) => {// ... 根据一些情况进行处理并设置状态码、message、header等信息if(xxxxx){response.statusCode == xxxxresponse.statusMessage = 'xxxxx'response.setHeader('Content-Type': ['yyyy', 'qqqq'])}// ...// 设置响应体response.write(yourData)// ...request.on('data', (chunk) => {body += chunk})// ....response.end()
} )

网页资源加载过程

网页引入外部资源

静态与动态资源

搭建静态资源服务

网页URL的使用

mime类型

媒体类型mime是一种标准,用来表示文档、文件或者字节流的性质和格式

HTTP服务可以设置响应头Conent-Type来表示响应体的MIME类型,浏览器会根据该类型决定如何处理资源

常见文件的mime类型

文件类型对应mime类型
htmltext/html
csstext/css
jstext/javascript
pngimage/png
jpgimage/jpeg
gifimage/gif
mp4vidio/mp4
mp3audio/mpeg
jsonapplication/json

对于未知的资源类型,可以使用application/octet-stream类型,浏览器在遇到该类型的响应时,会对响应体内容进行独立存储

乱码问题

headers里面设置字符集编码utf-8

错误处理

对err.code进行switch case

GET 和 POST 的场景以及区别

GET请求使用场景:

  • 在地址栏输入url访问
  • 点击a标签
  • <link>标签引入css
  • <script>标签引入js
  • <video>和<audio>引入多媒体
  • <img>标签引入图片
  • <form>标签中的method为get
  • AJAX中的get请求

POST请求的情况

  • <form>标签中的method为post
  • AJAX中的post请求

区别

  • 作用:GET请求用来获取数据,POST请求用来提交数据
  • 参数位置:GET请求的参数是拼接在URL之后,而POST是参数放在请求体data
  • 安全性:POST请求相对更安全,因为参数不会暴露在url里
  • GET请求大小一般限制为2k,POST请求没有大小限制

模块化

类比组件思维,就是为了高内聚低耦合,提高复用性和可维护性,防止命名冲突

在node.js中,导入模块或者文件要使用require()

模块化示例如下:

// 暴露模块
// ./test.js
function sendCoursesList(){// ...
}// 模块暴露单个数据
modules.exports = sendCoursesList// ./index.js中导入模块
const sendCoursesList = require('./test.js')
sendCoursesList()

模块暴露对象写法:还是以上面为例

// ./test.js
modules.exports = {sendCoursesList,fn1,// ...fn2: getList()
}// ./index.js
const test = require('./test.js')test.getList()

模块暴露变量:下面是例子

// ./test.js
exports.fn1 = sendCoursesList// ./index.js
const test = require('./test.js')
test.fn1()
  • modules.export可以暴露任意数据
  • 不可以使用exports = value的形式暴露数据,模块内部存在module与exports的隐式关系:exports = modules.exports = {}
  • 根据上面那条,导入后得到的是一个对象

CommonJS模块化规范

以上的module.exportsexportsrequire都是CommonJS规范中的内容,Node.js的编写要遵从CommonJS模块化规范,这就像JS和ECMAScript规范一样

有关CommonJSESM的区别,后面会专门出一篇文章总结,这里占个坑


https://www.xjx100.cn/news/3118830.html

相关文章

[Ubuntu 18.04] RK3399搭建NFS服务实现共享目录

NFS(Network File System)是一种分布式文件系统协议,允许远程计算机通过网络访问存储在另一台计算机上的文件。它使得多台计算机可以共享文件,并且可以在不同计算机之间实现文件的透明访问和共享。 以下是 NFS 服务器的一些特点和介绍: 文件共享:NFS 服务器允许将存储在…

pip安装python包(pytorch)时遇到超时现象的通用解决方案

最近在使用服务器配置pytorch环境的时候&#xff0c;遇到了极为恼火的事情&#xff0c;使用pytorch官方的命令来下载GPU版本的pytorch总会是不是下载到一半就会崩溃&#xff0c;然而pip下载并不会断点续传&#xff08;什么时候能出这个功能啊喂&#xff01;&#xff09;。每次下…

Spring-AOP与声明式事务

为什么要用AOP ①现有代码缺陷 针对带日志功能的实现类&#xff0c;我们发现有如下缺陷&#xff1a; 对核心业务功能有干扰&#xff0c;导致程序员在开发核心业务功能时分散了精力 附加功能分散在各个业务功能方法中&#xff0c;不利于统一维护 ②解决思路 解决这两个问题&…

【error:Custom elements in iteration require ‘v-bind:key‘ directives】元素绑定:key

在vue3中使用v-for操作的时候&#xff0c;报error Custom elements in iteration require v-bind:key directives 当我想自定义绘制echarts图的代码&#xff1a; <el-row><div v-if"data.chartDataList.length > 0"><el-col :span"12&quo…

「Verilog学习笔记」状态机-非重叠的序列检测

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 根据题意 定义一个五位的中间变量lock 每次始终上升沿来临时 判断当前寄存器的低四位新数据是否等于10111 如果等于 则下一时刻lock应被清空 否则lock等于当前的lock的低四…

Linux基础项目开发1:量产工具——输入系统(三)

前言&#xff1a; 前面我们已经实现了显示系统&#xff0c;现在我们来实现输入系统&#xff0c;与显示系统类似&#xff0c;下面让我们一起来对输入系统进行学习搭建吧 目录 一、数据结构抽象 1. 数据本身 2. 设备本身&#xff1a; 3. input_manager.h 二、触摸屏编程 to…

python类的多重继承继承和查找顺序

1 python类的多重继承继承和查找顺序 python中&#xff0c;类的多重继承允许子类继承多个基类&#xff0c;子类可以访问多个基类的属性和方法。 1.1 多重继承基础 用法 class MulClass(BaseC1,BaseC2,...BaseCn):pass描述 Mulclass&#xff1a;子类&#xff08;或者称混合…

面试篇之微服务(二)

目录 服务容灾 21.什么是服务雪崩&#xff1f; 22.什么是服务熔断&#xff1f;什么是服务降级&#xff1f; 什么是服务熔断&#xff1f; 什么是服务降级&#xff1f; 有哪些熔断降级方案实现&#xff1f; 23.Hystrix怎么实现服务容错&#xff1f; 24.Sentinel怎么实现限…