课程信息
课程名称: Node.js+Express+Koa2+开发Web Server博客
课程章节: 第6章 博客项目之登录
课程讲师: 双越
课堂笔记
1、日志概要
1.日志简介
系统没有日志,就等于人没有眼睛:抓瞎。日志通常放在文件中。
QPS:每秒访问量峰值。
2.日志分类
(1)访问日志 access log,server端最重要的日志
(2)自定义日志,包括自定义事件、错误记录等
3.日志存放在文件中的原因
1:对性能要求不高
2:体积较大
3:不同设备查看成本低(不需要部署环境就可查看)
4.nodejs文件操作
const fs = require("fs")
const path = require("path")
// 获取文件路径
const fileName = path.resolve(__dirname, "data.txt")
console.log(fileName)
// 读取文件内容
fs.readFile(fileName, (err, data) => {
if (err) {
console.error(err)
return
}
// data是二进制类型,需要转换为字符串
console.log(data.toString())
})
// 写入文件
const content = "这是新写入的内容\n"
const opt = {
flag: "a" // 追加写入,覆盖用"w"
}
fs.writeFile(fileName, content, opt, (err) => {
if (err) {
console.error(err)
}
})
// 判断文件是否存在
fs.exists(fileName, (exist) => {
console.log("exist",exist)
})
2、stream介绍
1、IO简介(IO操作的性能瓶颈)
IO,包括网络IO和文件IO。I:IN,O:OUT。
相比于CPU计算和内存读写,IO的突出特点:慢。
2.如何在有限的硬件资源下提高IO的操作效率
可以用stream(流水)。写入和写出就类似于source和dest的倒入和倒出过程。
在网上看视频,像爱奇艺,视频资源是一点一点慢慢给你,而不是一开始就让你加载完,这种成本会非常低,他能节省很多资源。
如:网络
3.基本案例
(1)标准输入输出
// pipe是管道的意思,输入什么内容就显示什么内容,由输入流向输出。
// process.stdin:来源;process.stdout:目的地
process.stdin.pipe(process.stdout)
(2)网络IO
// request写的内容,会在response中显示
const http = require('http')
const server = http.createServer((req, res) => {
if (req.method === 'POST') {
req.pipe(res)
}
})
server.listen(8000)
(3)文件IO
// 复制文件
const fs = require('fs')
const path = require('path')
// 两个文件名
const fileName1 = path.resolve(__dirname, 'data.txt')
const fileName2 = path.resolve(__dirname, 'data-bak.txt')
// 读取文件的stream对象
const readStream = fs.createReadStream(fileName1)
// 写入文件的stream对象
const writeStream = fs.createWriteStream(fileName2)
// 执行拷贝,通过pipe一点一点写入
readStream.pipe(writeStream)
// 数据读取完成,即拷贝完成
readStream.on('data', chunk => {
console.log(chunk.toString())
})
readStream.on('end', () => {
console.log('copy done')
})
(4)将文件IO和网络IO进行结合
const http = require('http')
const fs = require('fs')
const path = require('path')
const fileName1 = path.resolve(__dirname, 'data.txt')
const server = http.createServer((req, res) => {
if (req.method === 'GET') {
const readStream = fs.createReadStream(fileName1)
readStream.pipe(res) // 将res作为stream的dest
}
})
server.listen(8000)