代码地址:https://github.com/changeclass/Node_Blog.git
# NodeJs 文件操作
无论是读与写都需要导入 fs
模块,这个模块是 nodejs 自带的模块。不需要进行安装。
其次还需要导入一个 path
模块,用于路径的拼接。
node 环境提供了一个变量 __dirname
表示当前的路径。因此使用此变量与文件名进行拼接即可获取到当前的文件。
const fs = require('fs') | |
const path = require('path') | |
const fileName = path.resolve(__dirname, 'data.txt') |
# 读
// 读取文件内容 | |
fs.readFile(fileName,(err,data)=>{ | |
if (err){ | |
console.error(err) | |
return | |
} | |
//data 是二进制类型 | |
console.log(data.toString()) | |
}) |
# 写
// 写入文件 | |
const content = '这是写入的内容\n' | |
const opt = { | |
flag: 'a' | |
} | |
fs.writeFile(fileName, content, opt, (err) => { | |
if (err) { | |
console.error(err) | |
} | |
}) |
# 使用 stream 流优化 IO 操作
# 复制文件操作
// 复制文件 | |
const fs = require('fs') | |
const path = require('path') | |
const fileName1 = path.resolve(__dirname,'data.txt') | |
const fileName2 = path.resolve(__dirname,'data-back.txt') | |
const readStream = fs.createReadStream(fileName1) | |
const writeStream = fs.createWriteStream(fileName2) | |
// 连接管道 | |
readStream.pipe(writeStream) | |
// 监听每次读取数据 | |
readStream.on('data',chunck=>{ | |
console.log(chunck.toString()) | |
}) | |
// 监听读取完成 | |
readStream.on('end',()=>{ | |
console.log('copy done') | |
}) |
# 访问某个接口返回文本内容
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) | |
} | |
}) | |
server.listen(8000) |
# 写日志
我们将日志文件放在根目录下的 logs
文件夹的文件里。将写日志的具体逻辑写在 src 目录下 utils
文件夹下的 log.js
文件里。
const fs = require('fs') | |
const path = require('path') | |
// 写 log | |
function writeLog(writeStream,log){ | |
writeStream.write(log+'\n') | |
} | |
// 生成 write Stream | |
function createWriteStream(fileName){ | |
const fullFileName = path.join(__dirname,'../','../','logs',fileName) | |
return fs.createWriteStream(fullFileName, { | |
flags: 'a' | |
}) | |
} | |
// 将生成的 writeStream 流返回 | |
const accessWriteStream = createWriteStream('access.log') | |
function access(log){ | |
writeLog(accessWriteStream,log) | |
} | |
module.exports = { | |
access | |
} |
接下来在路由开始处调用暴露的 access
函数即可。
# 拆分日志
日志拆分是为了更好的管理日志。例如按天拆分。在 Linux 系统中可以使用 crontab 设置定时任务。
大致逻辑:
- 在一天刚开始时将现有日志复制到另一个文件,并将其重命名为时间格式
- 清空原有日志文件
# 日志分析
日志分析的关键是 readline
模块。也就是逐行读取,其依赖于 stream。
也就是说如果想要逐行读取,那么首先要创建一个 stream。
// 创建 read stream | |
const readStream = fs.createReadStream(fileName) | |
// 创建 readline 对象 | |
const rl = readline.createInterface({ | |
input:readStream | |
}) |
接下来监听 line
事件和 close
事件即可。分别会在每一行读取完成后触发和全部读取完毕后触发。