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

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

系列文章

  • 【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的区别,后面会专门出一篇文章总结,这里占个坑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/183332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux mesg命令详解:如何设置终端机的写入权限并阻止或允许其他用户的信息显示(附实例教程和注意事项)

Linux mesg命令介绍 Linux mesg命令用于设置终端机的写入权限。当mesg设置为y时&#xff0c;其他用户可以利用write指令将信息直接显示在您的屏幕上。如果设置为n&#xff0c;则不允许其他用户将信息直接显示在你的屏幕上。 Linux mesg命令适用的Linux版本 mesg命令在大多数…

ESP32通过IIC同时驱动mpu6050和OLED

mpu6050 //安装库MPU6050_tockn1.5.2 //接线 供电3.3V scl--引脚22 sda----引脚21 #include <MPU6050_tockn.h> #include <Wire.h>MPU6050 mpu6050(Wire);void setup() {Serial.begin(115200);Wire.begin();mpu6050.begin();mpu6050.calcGyroOffsets(true);de…

Bert-VITS2本地部署遇到的错误

关于Bert-VITS2本地部署遇到的错误 1、在下载python中相关依赖时报错 building ‘hdbscan._hdbscan_tree’ extension error: Microsoft Visual C 14.0 or greater is required. Get it with “Microsoft C Build Tools”: https://visualstudio.microsoft.com/visual-cpp-bu…

【安全-SSH】SSH安全设置

今天发现自己的公有云服务器被攻击了 然后查看了登录日志&#xff0c;如上图 ls -sh /var/log/secure vim /var/log/secure然后增加了安全相关的设置 具体可以从以下方面增加安全性&#xff1a; 修改默认SSH端口公有云修改安全组策略及防火墙端口设置登录失败次数锁定用户及…

SH文件介绍

SH文件介绍 介绍SH文件示例执行SH文件具体用法 介绍 SH文件通常指的是 Shell 脚本文件&#xff0c;文件后缀名为.sh&#xff0c;其中包含一系列要由操作系统的命令解释器执行的命令。 在 Unix 和类 Unix 操作系统中&#xff0c;通常使用 Bourne Shell&#xff08;sh&#xff…

RabbitMQ消息模型之Routing-Direct

Routing Direct 在Fanout模式中&#xff0c;一条消息&#xff0c;会被所有订阅的队列都消费。但是在某些场景下&#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 在Direct模型下&#xff1a; 队列与交换机的绑定&#xff0c;不能是任意…

刷题笔记(第九天)

1. 求最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字符串 “”。 示例 1&#xff1a; 输入&#xff1a;strs [“flower”,“flow”,“flight”]输出&#xff1a;“fl” 示例 2&#xff1a; 输入&#xff1a;strs [“…

C++面试的一些总结day1:指针和引用的区别

文章目录 指针和引用的区别和作用定义区别作用 指针和引用的区别和作用 定义 指针&#xff1a;指针是一个变量&#xff0c;其值为指向对象的内存地址&#xff0c;而不是值本身。引用&#xff1a;可以理解为对象的别名&#xff0c;是另外一个变量的直接别名&#xff0c;用于创…

Spring不再支持Java8了

在今天新建模块的时候发现了没有java8的选项了&#xff0c;结果一查发现在11月24日&#xff0c;Spring不再支持8了&#xff0c;这可怎么办呢&#xff1f;我们可以设置来源为阿里云https://start.aliyun.com/ 。 java8没了 设置URL为阿里云的地址

【Vue3】源码解析-虚拟DOM

【Vue3】源码解析 系列文章什么是虚拟DOMVue 3虚拟DOM获取<template>内容生成AST语法树生成render方法字符串得到最终VNode对象 系列文章 【Vue3】源码解析-前置 【Vue3】源码解析-响应式原理 【Vue3】源码解析-虚拟DOM 什么是虚拟DOM 在浏览器中&#xff0c;HTML页面…

vue实现左侧固定菜单栏锚点及滚动高亮(组件封装)

vue实现左侧固定菜单栏锚点及滚动高亮 先上总代码&#xff1a; 子组件&#xff1a; <!-- LeftSidebar.vue --> <template><div class"left-sidebar"><a v-for"(item, index) in sidebarItems" :key"index" click"s…

WordPress(9)宝塔配置Redis

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、宝塔安装Redis2、安装好先关闭Redis1、Redis密码默认是没有的二、安装php、Redis扩展1.启动Redis三.WordPress 安装Redis1.安装Redis插件2.启动Redis前言 提示:这里可以添加本文要记录的…

Linux ubuntu20.04 安装使用 Intel sgx

文章目录 前言一、简介二、安装Intel SGX Software Stack2.1 安装Intel SGX driver2.2 Build the Intel SGX SDK and Inte SGX PSW Package2.3 Build the Intel SGX SDK and Intel SGX SDK Installer2.4 Install the Intel(R) SGX SDK2.5 Build the Intel SGX PSW and Intel SG…

5 面试题--redis

伪客户端&#xff1a; 伪客户端的 fd 属性值为 -1&#xff1b;伪客户端处理的命令请求来源于 AOF ⽂件或者 Lua 脚本&#xff0c;⽽不是⽹络&#xff0c;所以这种客户端不需要套接字连接&#xff0c;⾃然也不需要记录套接字描述符。⽬前 Redis 服务器会在两个地⽅ ⽤到伪客户端…

ThermalLabel SDK for .NET 13.0.23.1113 Crack

ThermalLabel SDK for .NET 是一个 .NET 典型类库&#xff0c;它允许用户和开发人员创建非常创新的条码标签并将其发布在 zebra ZPL、EPL、EPSON ESC、POS 以及 Honeywell intermec 指纹中通过在 VB.NET 或 C# 上编写 .NET 纯代码来实现热敏打印机&#xff0c;以实现项目框架的…

BiLSTM-CRF的中文命名实体识别

项目地址&#xff1a;NLP-Application-and-Practice/11_BiLSTM-ner-bilstm-crf/11.3-BiLSTM-CRF的中文命名实体识别/ner_bilstm_crf at master zz-zik/NLP-Application-and-Practice (github.com) 读取renmindata.pkl文件 read_file_pkl.py # encoding:utf-8import pickle# …

分享一些基于php商城案例

案例1&#xff1a; ​​​​​​http://www.9520.xin/ 案例2&#xff1a; http://ptll.hasbuy.com/ 案例3&#xff1a; http://likeshop.9520.xin/mobile 案例4&#xff1a; http://www.hasbuy.com/

Ubuntu Linux玩童年小霸王插卡游戏

1.下载安装模拟器 在Windows平台模拟器非常多&#xff0c;而且效果也很优秀&#xff0c;Linux平台的用户常常很羡慕&#xff0c;却因为系统的缘故&#xff0c;无法使用这样的模拟器&#xff0c;但是随着时代的发展&#xff0c;Linux平台也出现了许多优秀的模拟器&#xff0c;现…

CTF ssrf+pin

什么是pin码 pin码是flask在开启debug模式下&#xff0c;进行代码调试模式所需的进入密码&#xff0c;需要正确的PIN码才能进入调试模式,可以理解为自带的webshell pin码如何生成 pin码生成要六要素 1.username 在可以任意文件读的条件下读 /etc/passwd进行猜测 2.modname 默…

navigator.clipboard is undefined in JavaScript issue [Fixed]

navigator.clipboard 在不安全的网站是无法访问的。 在本地开发使用localhost或127.0.0.1没有这个问题。因为它不是不安全网站。 在现实开发中&#xff0c;可能遇到测试环境为不安全网站。 遇到这个问题&#xff0c;就需要将不安全网站标记为非不安全网站即可。 外网提供了3…