写在最前:跟着视频学习只是为了在新手期快速入门。想要学习全面、进阶的知识,需要格外注重实战和
官方技术文档
,文档建议作为手册使用
系列文章
- 【Node.js】笔记整理 1 – 基础知识
- 【Node.js】笔记整理 2 – 常用模块
- 【Node.js】笔记整理 3 – npm
- 【Node.js】笔记整理 4 – node版本管理工具 nvm
- 【Node.js】笔记整理 5 – Express框架简单入门
1、 fs —— 文件模块
fs模块提供了对文件、文件夹操作的能力。在这个模块中,写入的数据如果想要换行,需要使用rn
,而不是n
另外请注意,读取到的都是Buffer
,你需要按照文件的格式选择对应的方法将其转化为需要的数据,比如读取txt文件,你可以使用toString()
进行转换
const fs = require('fs')
文件写入
需要持久化保持数据时,除了直接存储在数据库,还有可以利用文件写入
writeFile – 异步写入文件
语法:fs.writeFile(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])
createWriteStream – 流式写入
语法: fs.createWriteStream(path[, options])
使用流式写入时,需要先和文件建立通道: const ws = createWriteStream('filePath')
然后可以使用ws.wirte(data)
写入内容,文件内容写入完毕后,使用ws.close()
关闭通道,通道关闭前都可以向对应文件中写入数据
const ws = fs.createWriteStream('filePath')
// 流式写入数据
ws.write('hello worldrn')
// 关闭通道
ws.close()
读取文件
当需要读外部文件获取信息时候都要进行文件读取,比如读音乐、读视频、读系统文件等等
readFile – 异步读取
语法:fs.readFile(path[, options], callback(err, data))
const fs = require('fs')
fs.readFile('./hello.js', (err, data) => {
if(err){
// ...
}
// 读取到的是Buffer, 还需要转字符串
if(data){
data = data.toString()
}
})
readFileSync – 同步读取
语法: fs.readFileSync(path[, options])
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(path, newPath, callback(err))
同步版本: fs.renameSync(path, newPath)
const fs = require('fs')
fs.rename('./hello.js', './newName.js', err => {
if(err){
//...
}else{
//...
}
})
文件删除
语法:unlink( path, callback(err) )
同步版类推
node 14.4版本引入了新的删除文件API —— rm
、rmSync
语法:fs.rm( path. callback(err) )
文件夹操作
API | 功能 |
---|---|
mkdir、mkdirSync | 创建文件夹 |
readdir、readdirSync | 读取文件夹 |
rmdir、rmdirSync (这两个api将来会被移除)、rm(建议使用) | 删除文件夹 |
1、创建文件夹
语法: 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
})
语法:fs.rm( path, callback(err) )
fs.rm('./a', { recursive: true }, err => {
//...
})
查看文件资源状态
语法: fs.state( path, [, options], callback(err, data) )
、同步版本fs.stateSync
data结构:
会用到的全局变量:
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
path.parse —— 解析路径
语法: path.parse( filePath )
返回值是一个Object:
3、Http
IP和端口
去看计网
http模块
const http = require('http')
http.createServer —— 创建http服务对象
语法: http.createServer( (request, 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 )
参数:
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
// 解析url
let resUrl = new URL(req.url , ip)
let pathName = resUrl.pathname
let query = res.query
let 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 == xxxx
response.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类型 |
---|---|
html | text/html |
css | text/css |
js | text/javascript |
png | image/png |
jpg | image/jpeg |
gif | image/gif |
mp4 | vidio/mp4 |
mp3 | audio/mpeg |
json | application/json |
对于未知的资源类型,可以使用application/octet-stream
类型,浏览器在遇到该类型的响应时,会对响应体内容进行独立存储
乱码问题
错误处理
GET 和 POST 的场景以及区别
GET请求使用场景:
- 在地址栏输入url访问
- 点击a标签
- <link>标签引入css
- <script>标签引入js
- <video>和<audio>引入多媒体
- <img>标签引入图片
- <form>标签中的method为get
- AJAX中的get请求
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()
CommonJS模块化规范
以上的module.exports
、exports
、require
都是CommonJS
规范中的内容,Node.js
的编写要遵从CommonJS
模块化规范,这就像JS和ECMAScript规范一样
有关CommonJS
和ESM
的区别,后面会专门出一篇文章总结,这里占个坑
原文地址:https://blog.csdn.net/liushi21/article/details/134684302
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_10425.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!