代码地址: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)

image-20201008182353384

# 写日志

我们将日志文件放在根目录下的 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 函数即可。

image-20201008215530324

# 拆分日志

日志拆分是为了更好的管理日志。例如按天拆分。在 Linux 系统中可以使用 crontab 设置定时任务。

大致逻辑:

  • 在一天刚开始时将现有日志复制到另一个文件,并将其重命名为时间格式
  • 清空原有日志文件

# 日志分析

日志分析的关键是 readline 模块。也就是逐行读取,其依赖于 stream。

也就是说如果想要逐行读取,那么首先要创建一个 stream。

// 创建 read stream
const readStream = fs.createReadStream(fileName)
// 创建 readline 对象
const rl = readline.createInterface({
    input:readStream
})

接下来监听 line 事件和 close 事件即可。分别会在每一行读取完成后触发和全部读取完毕后触发。

更新于

请我喝[茶]~( ̄▽ ̄)~*

Dreamy.TZK 微信支付

微信支付

Dreamy.TZK 支付宝

支付宝