NodeJS
NodeJS
Buffer
概念
Buffer是一个类似于数组的对象,用于表示固定长度的字节序列
Buffer本质是一段内存空间,专门用来处理二进制数据
特点
- Buffer大小固定且无法调整
- Buffer性能较好,可以直接对计算机内存进行操作
- 每个元素的大小为1字节(byte)
使用
创建Buffer
1 | //创建了一个长度为 10 字节的 Buffer,相当于申请了 10 字节的内存空间,每个字节的值为 0 |
Buffer与字符串的转化
可以借助toString方法将Buffer转为字符串
1 | let buf_4 = Buffer.from([105, 108, 111, 118, 101, 121, 111, 117]); |
Buffer的读写
Buffer可以直接通过[]的方式对数据进行处理。
1 | // 读取 |
注意:如果修改的数值超过255,则超过8位数据会被舍弃
一个uff-8的字符一般占3个字节
fs模块
fs全称为file system,称之为文件系统,是Node.js中的内置模块,可以对计算机中的磁盘进行操作。
文件写入
文件写入就是将数据保存到文件当中。
| 方法 | 说明 |
|---|---|
| writeFile | 异步写入 |
| writeFileSync | 同步写入 |
| appendFile / appendFileSync | 追加写入 |
| createWriteStream | 流式写入 |
writeFile异步写入
语法:
1 | fs.writeFile(file, data[, options], callback) |
参数说明
- file 文件名
- data 待写入的数据
- options 选项设置(可选)
- callback 写入回调
返回值:undefined
代码示例:
1 | // require 是 Node.js 环境中的'全局'变量,用来导入模块 |
writeFileSync同步写入
语法:
1 | fs.writeFileSync(file, data[, options]) |
参数与fs.writeFile大体一致,只是没有callback参数
返回值:undefined
代码示例:
1 | try{ |
Node.js中的磁盘操作是由其他线程完成的,结果的处理有两种模式
- 同步处理 javascript主线程会等待其他线程的执行结果,然后再继续执行主线程的代码
- 异步处理 javascript主线程不会等待其他线程的执行结果,直接执行后续的主线程代码
appendFile / appendFileSync追加写入
appendFile作用是在文件尾部追加内容,appendFile语法于writeFile语法完全相同
语法:
1 | fs.appendFile(file, data[, options], callback) |
返回值:二者都会undefined
示例代码:
1 | fs.appendFile('./座右铭.txt','择其善者而从之,其不善者而改之。', err => { |
createWriteStream流式写入
语法:
1 | fs.createWriteStream(path[, options]) |
参数说明
- path 文件路径
- options 选项配置(可选)
返回值:Object
代码示例:
1 | let ws = fs.createWriteStream('./观书有感.txt'); |
程序打开一个文件是需要消耗资源的,流式写入可以减少打开关闭文件的次数。
流式写入方式适用于大文件写入或者频繁写入的场景,writeFile适合于写入频率较低的场景。
写入文件的场景
文件写入在计算机中是一个非常常见的操作,下面的场景都用到了文件写入
- 下载文件
- 安装软件
- 保存程序日志,入Git
- 编辑器保存文件
- 视频录制
当需要持久化保存数据的时候,应该想到文件写入
文件读取
文件读取顾名思义,就是通过程序从文件中取出其中的数据,可以使用如下几种方式:
| 方法 | 说明 |
|---|---|
| readFile | 异步读取 |
| readFileSync | 同步读取 |
| createReadStream | 流式读取 |
readFile异步读取
语法:
1 | fs.readFile(path[, options], callback) |
参数说明:
- path 文件路径
- options 选项配置
- callback 回调函数
返回值:undefined
示例代码:
1 | //导入 fs 模块 |
readFileSync同步读取
语法:
1 | fs.readFileSync(path[, options]) |
参数说明:
- path 文件路径
- options 选项配置
返回值:string | Buffer
代码示例:
1 | let data = fs.readFileSync('./座右铭.txt'); |
createReadStream流式读取
语法:
1 | fs.createReadStream(path[, options]) |
参数说明:
- path 文件路径
- options 选项配置(可选)
代码示例:
1 | //创建读取流对象 |
读取文件应用场景
- 电脑开机
- 程序运行
- 编辑器打开文件
- 查看图片
- 播放视频
- 播放音乐
- Git查看日志
- 上传文件
- 查看聊天记录
文件移动与重命名
在Node.js中,我们可以使用rename或renameSync来移动或重命名文件或文件夹
语法:
1 | fs.rename(oldPath, newPath, callback) |
参数说明:
- oldPath 文件当前的路径
- newPath 文件新的路径
- callback 操作后的回调
代码示例:
1 | fs.rename('./观书有感.txt', './论语/观书有感.txt', (err) =>{ |
文件删除
在Node.js中,我们可以使用unlink、unlinkSync、rm、rmSync来删除文件
语法:
1 | fs.unlink(path, callback) |
参数说明:
- path 文件路径
- callback 操作后的回调
代码示例:
1 | const fs = require('fs'); |
文件夹操作
借助Node.js的能力,可以对文件夹进行创建、读取、删除等操作
| 方法 | 说明 |
|---|---|
| mkdir / mkdirSync | 创建文件夹 |
| readdir / readdirSync | 读取文件夹 |
| rmdir / rmdirSync | 删除文件夹 |
创建文件夹
语法:
1 | fs.mkdir(path[, options], callback) |
参数说明:
- path 文件夹路径
- options 选项配置(可选)
- calback 操作后的回调
示例代码:
1 | fs.mkdir('./page', err => { |
读取文件夹
语法:
1 | fs.readdir(path[, options], callback) |
参数说明:
- path 文件夹路径
- options 选项配置(可选)
- callback 操作后的回调
示例代码:
1 | //异步读取 |
删除文件夹
语法:
1 | fs.rmdir(path[, options], callback) |
参数说明:
- path 文件夹路径
- options 选项配置(可选)
- callback 操作后的回调
示例代码:
1 | //异步删除文件夹 |
查看资源状态
在Node.js中,可以使用stat或statSync来查看资源的详细信息
语法:
1 | fs.stat(path[, options], callback) |
参数说明:
- path 文件夹路径
- options 选项配置(可选)
- callback 操作后的回调
示例代码:
1 | //异步获取状态 |
结果值对象结构:
- size 文件体积
- birthtime 创建时间
- mitime 最后修改时间
- isFile 检测是否为文件
- isDirectory 检测是否为文件夹
- …
__dirname
__dirname与require类似,都是Node.js环境中的’全局变量’
__dirname保存着当前文件所在目录的绝对路径,可以使用__dirname与文件名拼接成绝对路径
代码示例:
1 | let data = fs.readFileSync(__dirname + '/data.txt'); |
path模块
path模块提供了操作路径的功能,如下为几个常用的API:
| API | 说明 |
|---|---|
| path.resolve | 拼接规范的绝对路径 |
| path.sep | 获取操作系统的路径分隔符 |
| path.parse | 解析路径并返回对象 |
| path.basename | 获取路径的基础名称 |
| path.dirname | 获取路径的目录名 |
| path.extname | 获取路径的扩展名 |
代码示例:
1 | const path = require('path'); |
HTTP协议
一、概念
HTTP(hypertext transport protocol)协议;中文叫超文本传输协议
是一种基于TCP/IP的应用层通信协议
这个协议详细规定了浏览器和万维网服务器之间互相通信的规则
协议中主要规定了两个方面的内容
- 客户端:用来向服务器发送数据,可以被称之为请求报文
- 服务端:向客户端返回数据,可以被称之为响应报文
报文:可以简单理解为就是一堆字符串
二、请求报文的组成
- 请求行
- 请求头
- 空行
- 请求体
三、HTTP的请求行
- 请求方法(get、post、put、delete等)
- 请求URL(统一资源定位器)
- 例如:http://www.baidu.com:80/index.html?a=100&b=200#logo
- http:协议(https、ftp、ssh等)
- www.baidu.com 域名
- 80 端口号
- /index.html 路径
- a=100&b=200 查询字符串
- #logo 哈希(锚点链接)
- 例如:http://www.baidu.com:80/index.html?a=100&b=200#logo
- HTTP协议版本号
四、HTTP请求头
格式:【头名:头值】
常见的请求头有:
| 请求头 | 解释 |
|---|---|
| Host | 主机名 |
| Connection | 链接的设置 keep-alive(保持连接);close(关闭连接) |
| Cache-Control | 缓存控制 max-age = 0 (没有缓存) |
| Upgrade Insecure Requests | 将网页中的http请求转化为https请求(很少用)老网站升级 |
| User-Agent | 用户代理,客户端字符串标识,服务器可以通过这个标识来识别这个请求来自 哪个客户端 ,一般在PC端和手机端的区分 |
| Accept | 设置浏览器接收的数据类型 |
| Accept-Encoding | 设置接收的压缩方式 |
| Accept Language | 设置接收的语言 q=0.7 为喜好系数,满分为1 |
| Cookie |
五、HTTP请求体
请求体内容的格式是非常灵活的
(可以是空)==> GET请求
(也可以是字符串,还可以是JSON) ===> POST请求
六、响应报文的组成
- 响应行
- HTTP/1.1 200 OK
- HTTP/1.1:HTTP协议版本号
- 200:响应状态码 404 Not Found 500 Internal Server Error
- OK:响应状态描述
- HTTP/1.1 200 OK
- 响应头
- Cache-Control:缓存控制 private 私有的,只允许客户端缓存数据
- Connection 链接设置
- Content-Type:text/html;charset=utf-8 设置响应体的数据类型以及字符集,响应体为html,字符集utf-8
- Content-Length:响应体的长度,单位为字节
- 空行
- 响应体
响应体内容的类型是非常灵活的,常见的类型有HTML、CSS、JS、图片、JSON
七、创建HTTP服务
使用Node.js创建HTTP服务


