comelong blog comelong blog
首页
  • html5
  • JavaScript
  • ES6
  • Vue
  • react
  • Node
  • PHP
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

comelong

永远相信技术的力量
首页
  • html5
  • JavaScript
  • ES6
  • Vue
  • react
  • Node
  • PHP
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • NodeJS

    • express搭建后端服务
    • node文件读取处理
      • 1.文件写入
      • 2.文件追加写入
      • 3.文件流流式写入
      • 4.文件写入场景 需要持久化保存数据的时候需要文件写入
      • 5.文件流式读取
      • 6.文件复制
      • 2.文件追加写入
      • 7. 文件重命名和移动
      • 8.文件删除
      • 9.文件夹创建
      • 10.查看资源状态
      • 11. 批量重命名
      • 11. 批量重命名
      • 12.path模块
      • 13.获取请求行和请求头
      • 14.获取http请求体
      • 15.获取请求url和查询字符串
      • 16.获取请求url和查询字符串
      • 17.HTTP请求练习
      • 18. 设置HTTP响应报文
      • 19.错误处理
      • 20.GET和POST使用
      • 21.模块化
        • 1.文件导入
        • 2.requer模块导入的基本流程
        • 3.npm包管理工具
        • 4.require导入npm包的流程
        • 5.生产依赖和开发依赖
      • 22.npm配置命令别名
      • 23.cnpm 淘宝构建的镜像 (了解)
      • 24.npm配置淘宝镜像
      • 25.yarn
      • 26.npm发布包
        • 1.创建与发布
        • 2.更新包
    • express框架
    • mongodb
    • Api接口
  • 后端
  • NodeJS
comelong
2023-04-06
目录

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 类型,浏览器在遇到该类型的响应时,会对响应体内容进行独立存储,也就是我们常见的 下载 效果

image-20230415182358387

# 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

  1. yarn介绍 yarn是由Facebook在2016年推出的新的Javascript包管理工具,官方网址: https://yarnpkg.com/
  2. yarn特点 yarn官方宣称的一些特点 速度超快:yarn缓存了每个下载过的包,所以再次使用时无需重复下载。同时利用并行下载以最大化资源利用率,因此安装速度更快 超级安全:在执行代码之前,yarn会通过算法校验每个安装包的完整性 超级可靠:使用详细、简洁的锁文件格式和明确的安装算法,yarn 能够保证在不同系统上无差异的工作
  3. yarn安装 我们可以使用npm安装yarn npm i -g yarn
  4. yarn 的常用命令

# 26.npm发布包

# 1.创建与发布

https://www.bilibili.com/video/BV1gM411W7ex?p=91&spm_id_from=pageDriver&vd_source=7c7e701aa53a6181b25d76f63d3026f9

我们可以将自己开发的工具包发布到npm服务上,方便自己和其他开发者使用,操作步骤如下:

  1. 创建文件夹,并创建文件index.js,在文件中声明函数,使用module.exports暴露
  2. npm初始化工具包,package.json填写包的信息(包的名字是唯一的)
  3. 注册账号https://www.npmjs.com/signup
  4. 激活账号(一定要激活账号)
  5. 修改为官方的官方镜像(命令行中运行nrm use npm )
  6. 命令行下npm login填写相关用户信息
  7. 命令行下npm publish提交包

# 2.更新包

更新包

后续可以对自己发布的包进行更新,操作步骤如下 1.更新包中的代码 2.测试代码是否可用 3.修改package.json中的版本号4.发布更新 npm publish

image-20230417210137439

编辑 (opens new window)
上次更新: 2023/06/25, 09:27:47
express搭建后端服务
express框架

← express搭建后端服务 express框架→

最近更新
01
Api接口
07-30
02
分页组件
07-06
03
mongodb
05-07
更多文章>
Theme by Vdoing | Copyright © 2019-2023 comelong | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式