【Node.js】--- 基础知识

目录

初识 Nodejs

Buffer 缓冲区

Buffer 常用方法:

fs 文件系统模块

打开模式:

读取文件

流式文件读取

简便方式:

写入文件

简单文件写入

流式文件写入

路径动态拼接问题 __dirname

其它操作

验证路径是否存在:

获取文件信息:

删除文件:

列出文件:

截断文件:

建立目录:

删除目录:

重命名文件和目录:

监视文件更改:

path 路径模块

路径拼接 path.join()

获取路径中文件名 path.basename()

获取路径中文件扩展名 path.extname()

http 模块

创建基本 Web 服务器

实现简陋路由效果

模块化

模块化概念

Node.js 中模块的分类

Node.js 中的模块作用域

模块作用域的成员

CommonJS 模块化规范

模块加载机制

内置模块加载

自定义模块加载

第三方模块加载

目录作为模块加载

Express

Express 初体验

基本使用

托管静态资源

Express 路由

创建路由模块:

注册路由模块:

Express 中间件

中间件注意事项;

全局中间件

局部中间件

中间件分类

Express 内置中间件

第三方中间件

CORS 跨域资源共享

CORS

CORS 常见响应头

CORS 请求分类

数据库和身份认证

操作 mysql 数据库

查询数据

插入数据

更新数据

快捷方式:

删除数据

Web 开发模式

服务端渲染

优点:

缺点:

前后端分离

优点:

缺点:

身份认证

Session 认证机制

Session 工作原理

​编辑Express 中使用 Session 认证

配置中间件

向 session 中存数据

从 session 取数据

清空 session

JWT 认证机制

JWT 工作原理

Session 认证的局限性:

JWT 工作原理图:

JWT 组成部分:

JWT 使用方式:

Express 使用 JWT


初识 Nodejs


Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine

Node.js是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境

  • 基于 Express 框架 (opens new window),可以快速构建 Web 应用
  • 基于 Electron 框架 (opens new window),可以构建跨平台的桌面应用
  • 基于 restify 框架 (opens new window),可以快速构建 API 接口项目
  • 读写和操作数据库、创建实用的命令行工具辅助前端开发、etc…

Buffer 缓冲区

  • Buffer 的结构与数组类似,操作方法也与数组类似
  • 数组不能存储二进制文件,Buffer 是专门存储二进制数据的
  • Buffer 存储的是二进制数据,显示时以 16 进制的形式显示
  • Buffer 每一个元素范围是 00~ff,即 0255、0000000011111111
  • 每一个元素占用一个字节内存
  • Buffer 是对底层内存的直接操作,因此大小一旦确定就不能修改

Buffer 常用方法:

Buffer.from(str[, encoding]):将一个字符串转换为 Buffer
Buffer.alloc(size):创建指定大小的 Buffer
Buffer.alloUnsafe(size):创建指定大小的 Buffer,可能包含敏感数据(分配内存时不会清除内存残留的数据)
buf.toString():将 Buffer 数据转为字符串

var str = 'Hello前端'

var buf = Buffer.from(str)

// 占用内存的大小,一个汉字3字节 13
console.log(buf.length)
// 字符串的长度 7
console.log(str.length)
// 8进制输出第一个元素 145
console.log(buf[1].toString(8))

//创建一个10个字节的buffer
var buf2 = Buffer.alloc(10)
//通过索引,来操作buf中的元素
buf2[0] = 88
buf2[1] = 255
buf2[2] = 0xaa
buf2[3] = 255

var buf3 = Buffer.allocUnsafe(10)
console.log(buf3)


fs 文件系统模块

  • fs 模块中所有的操作都有两种形式可供选择:同步和异步
  • 同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码
  • 异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回
  • 实际开发很少用同步方式,因此只介绍异步方式

打开模式:

模式     说明
 读取文件,文件不存在抛异常
r+     读写文件,文件不存在抛异常
rs     同步模式下打开文件用于读取
rs+  同步模式下打开文件用于读写
w    写文件,不存在则创建,存在则覆盖原有内容
wx     写文件,文件存在打开失败
w+   读写文件,不存在创建,存在截断
wx+  读写,存在打开失败
a  追加,不存在创建
ax    追加,存在失败
a+   追加和读取,不存在创建
ax+     追加和读取,存在失败


读取文件

简单文件读取
语法格式:

fs.readFile(path[, options], callback)

  • path:文件路径
  • options:配置选项,若是字符串则指定编码格式

encoding:编码格式
flag:打开方式

  • callback:回调函数

err:错误信息
data:读取的数据,如果未指定编码格式则返回一个 Buffer

const fs = require('fs')
const fs = require('fs')

fs.readFile('./files/1.txt', 'utf-8', function(err, data) => {
  if(err) {
    return console.log('failed!' + err.message)
  }
  console.log('content:' + data)
})


// 复制文件内容
fs.readFile("C:/Users/笔记.mp3", function(err, data) {
	if(!err) {
		console.log(data);
		// 将data写入到文件中
		fs.writeFile("C:/Users/hello.jpg", data, function(err){
			if(!err){
				console.log("文件写入成功");
			}
		} );
	}
});


流式文件读取


简单文件读取的方式会一次性读取文件内容到内存中,若文件较大,会占用过多内存影响系统性能,且读取速度慢,大文件适合用流式文件读取,它会分多次将文件读取到内存中

var fs = require('fs')

// 创建一个可读流
var rs = fs.createReadStream('C:/Users/笔记.mp3')
// 创建一个可写流
var ws = fs.createWriteStream('a.mp3')

// 监听流的开启和关闭
// 这几个监听不是必须的
rs.once('open', function () {
  console.log('可读流打开了~~')
})

rs.once('close', function () {
  console.log('可读流关闭了~~')
  //数据读取完毕,关闭可写流
  ws.end()
})

ws.once('open', function () {
  console.log('可写流打开了~~')
})

ws.once('close', function () {
  console.log('可写流关闭了~~')
})

//要读取一个可读流中的数据,要为可读流绑定一个data事件,data事件绑定完毕自动开始读取数据
rs.on('data', function (data) {
  console.log(data)
  //将读取到的数据写入到可写流中
  ws.write(data)
})


简便方式:

var fs = require('fs')

var rs = fs.createReadStream('C:/Users/lilichao/Desktop/笔记.mp3')
var ws = fs.createWriteStream('b.mp3')

// pipe()可以将可读流中的内容,直接输出到可写流中
rs.pipe(ws)


写入文件

简单文件写入


语法格式:

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

  • file:文件路径
  • data:写入内容
  • options:配置选项,包含 encoding, mode, flag;若是字符串则指定编码格式
  • callback:回调函数
const fs = require('fs')
fs.writeFile('./files/2.txt', 'Hello Nodejs', function (err) {
  if (err) {
    return console.log('failed!' + err.message)
  }
  console.log('success!')
})

fs.writeFile('C:/Users/hello.txt', '通过 writeFile 写入的内容', { flag: 'w' }, function (err) {
  if (!err) {
    console.log('写入成功!')
  } else {
    console.log(err)
  }
})


流式文件写入


同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出

var fs = require('fs')

// 创建一个可写流
var ws = fs.createWriteStream('hello3.txt')

ws.once('open', function () {
  console.log('流打开了~~')
})

ws.once('close', function () {
  console.log('流关闭了~~')
})

// 通过ws向文件中输出内容
ws.write('通过可写流写入文件的内容')
ws.write('1')
ws.write('2')
ws.write('3')
ws.write('4')

// 关闭流
ws.end()


路径动态拼接问题 __dirname


在使用 fs 模块操作文件时,如果提供的操作路径是以 ./ ../ 开头的相对路径时,容易出现路径动态拼接错误的问题
原因:代码在运行的时候,会以执行 node 命令时所处的目录,动态拼接出被操作文件的完整路径
解决方案:在使用 fs 模块操作文件时,直接提供完整的路径,从而防止路径动态拼接的问题
__dirname 获取文件所处的绝对路径

fs.readFile(__dirname + '/files/1.txt', 'utf8', function(err, data) {
  ...
})


其它操作


验证路径是否存在:

fs.exists(path, callback)
fs.existsSync(path)


获取文件信息:

fs.stat(path, callback)
fs.stat(path)

删除文件:

fs.unlink(path, callback)
fs.unlinkSync(path)

列出文件:

fs.readdir(path[,options], callback)
fs.readdirSync(path[, options])


截断文件:

fs.truncate(path, len, callback)
fs.truncateSync(path, len)


建立目录:

fs.mkdir(path[, mode], callback)
fs.mkdirSync(path[, mode])


删除目录:

fs.rmdir(path, callback)
fs.rmdirSync(path)


重命名文件和目录:

fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)


监视文件更改:

fs.watchFile(filename[, options], listener)

path 路径模块

path 模块是 Node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。

路径拼接 path.join()

const path = require('path')
const fs = require('fs')

// 注意 ../ 会抵消前面的路径
// ./ 会被忽略
const pathStr = path.join('/a', '/b/c', '../../', './d', 'e')
console.log(pathStr) // \a\d\e

fs.readFile(path.join(__dirname, './files/1.txt'), 'utf8', function (err, dataStr) {
  if (err) {
    return console.log(err.message)
  }
  console.log(dataStr)
})


获取路径中文件名 path.basename()


使用 path.basename() 方法,可以获取路径中的最后一部分,常通过该方法获取路径中的文件名

path.basename(path[, ext])

  • path: 文件路径
  • ext: 文件扩展名
const path = require('path')

// 定义文件的存放路径
const fpath = '/a/b/c/index.html'

const fullName = path.basename(fpath)
console.log(fullName) // index.html

const nameWithoutExt = path.basename(fpath, '.html')
console.log(nameWithoutExt) // index


获取路径中文件扩展名 path.extname()


                
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值