node文件读取处理
# node文件读取等操作
# 1.文件写入
// 1.文件写入 // 异步 const fs = require('fs') fs.writeFile('d:/座右铭2.txt', '你好呀,我是node生成的数据', err => { if (err) { console.log('失败'); return } console.log('写入成功'); }) 同步引入 const fs = require('fs') fs.writeFileSync('./1.md','# 21312这是我的文章')
1
2
3
4
5
6
7
8
9
10
11
12
13
# 2.文件追加写入
2.文件追加写入 追加写入 appendFile const fs = require('fs') fs.appendFileSync('./1.md','\n# ,这是我追加的字体') 追加写入 fs.writeFile const fs = require('fs') fs.appendFileSync('./1.md', '\n# ,这是我追加的字体', { flag: 'a' }, err => { if (err) { throw err('失败') } console.log('成功'); })
1
2
3
4
5
6
7
8
9
10
11
12
13
# 3.文件流流式写入
fs流式写入 const fs = require('fs') const ws = fs.createWriteStream('./观书有感.md') ws.write('举头望明月,\n') ws.write('低头思故乡.\n')
1
2
3
4
5
# 4.文件写入场景 需要持久化保存数据的时候需要文件写入
异步读取 const fs = require('fs'); fs.readFile('./观书有感.md', (error, data) => { if (error) throw error; console.log(data.toString()); }) 同步读取 const fs = require('fs'); let data = fs.readFileSync('./座右铭.tex') console.log(data.toString()); 文件读取应用场景 程序运行 将相关文件内容读取出来载入内存当中,通过cpu进行处理,再通过显卡展示到屏幕上
1
2
3
4
5
6
7
8
9
10
11
12
# 5.文件流式读取
const fs = require('fs') 1.创建流式读取对象 const rs = fs.createReadStream('./demo.mp4') // 2.绑定data事件 rs.on('data', chunk => { console.log(chunk.length); }) // 3.end 可选事件 读取完成结束执行 rs.on('end', () => { console.log('读取完成'); })
1
2
3
4
5
6
7
8
9
10
11
# 6.文件复制
方式一 const fs = require('fs'); // 获取内存占用大小 const process = require('process'); // 读取 const data = fs.readFileSync('./demo.mp4') // 写入 fs.writeFileSync('./demo1.mp4', data) console.log(process.memoryUsage()); //执行完所占用的内存 28880896字节 方式二 创建读取流对象 const rs = fs.createReadStream('./demo.mp4') // 创建写入对象 const ws = fs.createWriteStream('./demo1.mp4') rs.on('data', chunk => { console.log(chunk); ws.write(chunk) }) rs.on('end', () => { console.log(process.memoryUsage()); // 29200384 })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 2.文件追加写入
2.文件追加写入 追加写入 appendFile const fs = require('fs') fs.appendFileSync('./1.md','\n# ,这是我追加的字体') 追加写入 fs.writeFile const fs = require('fs') fs.appendFileSync('./1.md', '\n# ,这是我追加的字体', { flag: 'a' }, err => { if (err) { throw err('失败') } console.log('成功'); })
1
2
3
4
5
6
7
8
9
10
11
12
13
# 7. 文件重命名和移动
/** * rename renameSync * 参数1:旧文件路径 旧文件名 * 参数2:新文件路径 新文件名 * */ const fs = require('fs') fs.rename('./demo.mp4', './新建文件夹1/demo1.mp4', err => { if (err) { console.log('失败'); } return }) 文件名修改 fs.renameSync('./新建文件夹', './新建文件夹1')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 8.文件删除
const fs = require('fs') /** * unlink: * 参数1 删除文件路径 * 参数2 回调参数 * * rm: node 14.4 * 参数1 删除文件路径 * 参数2 回调参数 */ fs.unlink('./1.txt', err => { console.log(err); if (err) { console.log('删除失败'); return } console.log('删除成功'); }) fs.rm('./2.txt', err => { if (err) { console.log('删除失败'); return } console.log('删除成功'); })
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
# 9.文件夹创建
const fs = require('fs'); fs.mkdir('./html/css/js', { recursive: true }, err => { if (err) { console.log('创建失败'); return } console.log('创建成功'); }) //读取文件夹 fs.readdir('./html', err => { if (err) { console.log('读取失败'); return } console.log('读取成功'); }) //删除文件夹 //不推荐 fs.rmdir('./html', { recursive: true }, err => { if (err) { console.log('删除失败'); return } console.log('删除成功'); }) //推荐 fs.rm('./html', { recursive: true }, err => { if (err) { console.log(err); return } console.log('删除成功'); })
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
# 10.查看资源状态
const fs = require('fs'); fs.stat('./新建文件夹1/demo1.mp4', (err, stats) => { if (err) { console.log(err); return } console.log(stats); }) /** * Stats { dev: 3563548735, mode: 33060, nlink: 1, uid: 0, gid: 0, rdev: 0, blksize: 4096, ino: 1125899908388483, size: 5657418, blocks: 11056, atimeMs: 1680948281596.9797, mtimeMs: 1680945308980.4949, ctimeMs: 1680948322919.4304, birthtimeMs: 1680948276549.6519, atime: 2023-04-08T10:04:41.597Z, mtime: 2023-04-08T09:15:08.980Z, ctime: 2023-04-08T10:05:22.919Z, birthtime: 2023-04-08T10:04:36.550Z } */
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
# 11. 批量重命名
2.文件追加写入 追加写入 appendFile const fs = require('fs') fs.appendFileSync('./1.md','\n# ,这是我追加的字体') 追加写入 fs.writeFile const fs = require('fs') fs.appendFileSync('./1.md', '\n# ,这是我追加的字体', { flag: 'a' }, err => { if (err) { throw err('失败') } console.log('成功'); })
1
2
3
4
5
6
7
8
9
10
11
12
13
# 11. 批量重命名
2.文件追加写入 追加写入 appendFile const fs = require('fs') fs.appendFileSync('./1.md','\n# ,这是我追加的字体') 追加写入 fs.writeFile const fs = require('fs') fs.appendFileSync('./1.md', '\n# ,这是我追加的字体', { flag: 'a' }, err => { if (err) { throw err('失败') } console.log('成功'); })
1
2
3
4
5
6
7
8
9
10
11
12
13
# 12.path模块
const path = require('path'); console.log(path.resolve(__dirname,'index.html')); console.log(path.sep); // 获取操作系统路径分隔符 windows: \ Linux: / console.log(path.parse('D:\\新建文件夹\\nodejs\\index.html')); //路径解析 console.log(path.basename('D:\\新建文件夹\\nodejs\\index.html')); // 获取文件路基基础名称 console.log(path.dirname('D:\\新建文件夹\\nodejs\\index.html'),321); //获取文件路径目录名 console.log(path.extname('D:\\新建文件夹\\nodejs\\index.html'),321); //获取文件路径扩展名
1
2
3
4
5
6
7
# 13.获取请求行和请求头
const http = require('http'); const server = http.createServer((req, res) => { // 获取请求方法 // console.log(req.method); // 获取请求url (只包含路径和查询字符串) // console.log(req.url); // 获取http版本号 // console.log(req.httpVersion); // 获取http请求头 // console.log(req.headers); res.setHeader('content-type', 'text/html;charset=utf-8') res.end('Hello NodeJs 是我呀') // 设置响应体 }) server.listen(9000, () => { console.log('启动成功'); })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 14.获取http请求体
const http = require('http'); const server = http.createServer((request, response) => { // response.setHeader('content-type', 'text/html;charset=utf-8') let body = '' request.on('data', (chunk) => { body += chunk }) request.on('end', (chunk) => { console.log(body); }) response.end('Hello NodeJs 是我呀') // 设置响应体 }) server.listen(9000, () => { console.log('启动成功'); })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 15.获取请求url和查询字符串
const http = require('http'); const url = require('url'); const server = http.createServer((request, response) => { let res = url.parse(request.url, true) //如果第二个参数设置为true query以对象格式返回 let pathName = res.pathname // 路径 console.log(pathName); let query = res.query // 参数 console.log(query.user); response.end('Hello NodeJs 是我呀') // 设置响应体 }) server.listen(9000, () => { console.log('启动成功'); })
1
2
3
4
5
6
7
8
9
10
11
12
13
# 16.获取请求url和查询字符串
const http = require('http'); const hostname = 'http://127.0.0.1' const port = 3000 const server = http.createServer((request, response) => { console.log(request.url,); let url = new URL(request.url, hostname) // console.log(url.pathname); //获取路径 console.log(url.searchParams.get('user')); //获取参数 response.end('Hello') // 设置响应体 }) server.listen(port, () => { console.log('启动成功'); })
1
2
3
4
5
6
7
8
9
10
11
12
13
# 17.HTTP请求练习
const http = require('http') const server = http.createServer((request, response) => { response.setHeader('Content-Type', 'text/html; charset=utf-8') let { pathname } = new URL(request.url, 'http://127.0.0.1') console.log(pathname); if (request.method === 'GET' && pathname === '/login') { response.end('这是登录页') } else if (request.method === 'GET' && pathname === '/register') { response.end('这是注册页面') } else { response.end('没有页面可访问') } }) server.listen(9000, () => { console.log('启动成功'); })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 18. 设置HTTP响应报文
const http = require('http') const server = http.createServer((request, response) => { // response.statusCode = 200 response.statusMessage = '2312' // 设置响应头 response.setHeader('Content-Type', 'text/html; charset=utf-8') response.setHeader('Cache-Control', 10000) response.setHeader('ddddd', [1, 2, 3, 45,]) // 可以设置多个响应头 []为所对应的数据 此处设置了四个相同的ddddd,分别对应数组的数据 // 设置响应体 response.write(`<h1 style="color:#fa0;">我是h1标题</h1>`) response.write(`<h2 style="color:#fa0;">我是h2标题</h2>`) response.end() // 必须有 且只能有一个 }) server.listen(9000, () => { console.log('启动成功'); })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 19.错误处理
HTTP 服务可以设置响应头 Content-Type 来表明响应体的 MIME 类型,浏览器会根据该类型决定如何处理资源下面是常见文件对应的 mime 类型
const http = require('http') const fs = require('fs'); const path = require('path'); const hostname = 'http://127.0.0.1' const port = 3000 let mimes = { html: 'text/html', css: 'text/css', js: 'text/javascript', png: 'image/png', jpg: 'image/jpeg', gif: 'image/gif', mp4: 'video /mp4', mp3: 'audio/mpeg', json: 'application/ison', } const server = http.createServer((request, response) => { // 获取请求url的路径 let { pathname } = new URL(request.url, hostname) let root = __dirname // 最终路径 let filePath = root + pathname console.log(filePath, 'filePath'); // 获取文件后缀名 txt let ext = path.extname(filePath).slice(1) // 获取文件所对应的资源类型 let type = mimes[ext] // 读取文件 fs.readFile(filePath, (err, data) => { // 设置读取错误的返回状态 https://www.nodeapp.cn/errors.html if (err) { switch (err.code) { case 'ENOENT': response.statusCode = 404 response.end('404 Not Found') case 'EPERM': response.statusCode = 405 response.end('无权限访问,请检查权限') default: response.statusCode = 500 response.end('Server Error') } response.end('文件读取失败') return } // 匹配到了 if (type) { response.setHeader('content-type', type) } else { // 没有匹配到 response.setHeader('content-type', 'application/octet-stream') } response.end(data) }) }) server.listen(port, () => { console.log('启动成功'); })
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
47
48
49
50
51
52
53
54
55
56
57
58
对于末知的资源类型,可以选择 application/octet-stream 类型,浏览器在遇到该类型的响应时,会对响应体内容进行独立存储,也就是我们常见的 下载 效果
# 20.GET和POST使用
场景
GET 请求的情况
在地址栏直接输入 url 访问 点击 a 链接. link 标签引入 css script 标签引入js video 与 audio 引入多媒体 img 标签引入图片 orm 标签中的 method 为 get (不区分大小写) ajax 中的 get 请求
POST 请求的情况
form 标签中的 method 为 post (不区分大小写) AJAX的 post 请求
请求区别
GET 和 POST 是 HTTP 协议请求的两种方式,主要有如下几个区别 1.作用。GET 主要用来获取数据,POST 主要用来提交数据 2.参数位置。GET 带参数请求是将参数缀到 URL之后,POST带参数请求是将参数放到请求体中安全性。
3.POST 请求 相对 GET 安全一些,因为在浏览器中参数会暴露在地址栏
4.GET 请求大小有限制,一般为 2 K,而 POST 请求则没有大小限制
# 21.模块化
# 1.文件导入
在模块中使用require传入文件路径即可引入文件
const test = require( ' ./me.js ' ); require使用的一些注意事项: 1,对于自己创建的模块,导入时路径建议写相对路径,且不能省略﹒/和../ 2. js 和 json文件导入时可以不用写后缀,c/c++编写的node扩展文件也可以不写后缀,但是一般用不到 3.如果导入其他类型的文件,会以js文件进行处理 4.如果导入的路径是个文件夹,则会首先检测该文件夹下 package .json文件中 main属性对应的文件, 如果存在则导入,反之如果文件不存在会报错。 如果main属性不存在,或者package.json不存在则会尝试导入文件夹下的index.js和 index.json如果还是没找到,就会报错 5.导入node.,js内置模块时,直接require模块的名字即可,无需加﹒/和../
1
2
3
4
5
6
7
8
9
# 2.requer模块导入的基本流程
# 3.npm包管理工具
- 初始化包
npm init "name " : "1-npm", #包的名字 "version" : "1.0.0",#包的版本"description" : "", #包的描述 "main" : "index.js ", #包的入口文件 "scripts" : { #脚本配置 "test" : "echo \ "Error : no test specified\" && exit 1”}, "author" : "", #作者 "license" : "ISC" #开源证书
1
2
3
4
5
6
7
8
9
10
11
12
13
14
- 注意事项
初始化的过程中还有一些注意事项: 1. package name(包名)不能使用中文、大写,默认值是文件夹的名称,所以文件夹名称也不能使用中文 和大写 2. version(版本号)要求`x.x.x`的形式定义,x必须是数字,默认值是1.0.03. ISC证书与MIT证书功能上是相同的,关于开源证书扩展阅读 http://www.ruanyifeng.com/blog/2011/05/how to choose free software licenses.html4.package . json可以手动创建与修改 5.使用npm init -y或者npm init --yes极速创建package . json
1
2
3
4
5
6
# 4.require导入npm包的流程
const uniq = require('uniq') //导的文件夹 1.首先它会在node_modules文件夹下查找#package.json# main属性下的文件 2.如果在node_modules文件夹下没有查找到,它会向根目录继续查找
1
2
3
# 5.生产依赖和开发依赖
-D开发 -S生产
# 22.npm配置命令别名
package.json中的scripts属性
# 23.cnpm 淘宝构建的镜像 (了解)
# 24.npm配置淘宝镜像
- 工具配置
npm i nrm -g 全局安装nrm nrm use taobao // 切换淘宝镜像 nrm ls //镜像列表地址 可以切换 npm config list // 检查是否安装淘宝镜像 淘宝镜像只能下载安装工具包 如果需要上传自己的工具包到npm需要切换回原地址
1
2
3
4
5
查看当前使用的镜像地址命令
npm config get registry
切换为淘宝镜像命令(安装一些package容易报错)
npm config set registry https://registry.npm.taobao.org
切换回原镜像(安装一些package不容易报错)
npm config set registry https://registry.npmjs.org
# 25.yarn
- yarn介绍 yarn是由Facebook在2016年推出的新的Javascript包管理工具,官方网址: https://yarnpkg.com/
- yarn特点 yarn官方宣称的一些特点 速度超快:
yarn缓存了每个下载过的包,所以再次使用时无需重复下载。同时利用并行下载以最大化资源利用率,因此安装速度更快
超级安全:在执行代码之前,yarn会通过算法校验每个安装包的完整性 超级可靠:使用详细、简洁的锁文件格式和明确的安装算法,yarn 能够保证在不同系统上无差异的工作- yarn安装 我们可以使用npm安装yarn npm i -g yarn
- yarn 的常用命令
# 26.npm发布包
# 1.创建与发布
https://www.bilibili.com/video/BV1gM411W7ex?p=91&spm_id_from=pageDriver&vd_source=7c7e701aa53a6181b25d76f63d3026f9
我们可以将自己开发的工具包发布到npm服务上,方便自己和其他开发者使用,操作步骤如下:
- 创建文件夹,并创建文件index.js,在文件中声明函数,使用module.exports暴露
- npm初始化工具包,package.json填写包的信息(包的名字是唯一的)
- 注册账号https://www.npmjs.com/signup
- 激活账号(一定要激活账号)
- 修改为官方的官方镜像(命令行中运行nrm use npm )
- 命令行下npm login填写相关用户信息
- 命令行下npm publish提交包
# 2.更新包
更新包
后续可以对自己发布的包进行更新,操作步骤如下 1.更新包中的代码 2.测试代码是否可用 3.修改package.json中的版本号4.发布更新 npm publish