Javascript提高:Node.js readline 模块 完整使用教程

Node.js readline 模块 完整使用教程

readline 是 Node.js 内置核心模块 ,无需安装,直接 require 即可使用,核心作用:逐行读取流数据(日志文件、命令行输入、大文件读取必备),完美解决大文件一次性加载内存溢出问题。

下面给你最常用、最实用的用法,直接复制就能跑。


一、最核心:逐行读取日志文件(高频用法)

处理日志文件 90% 场景都用这个:

javascript 复制代码
const fs = require('fs');
const readline = require('readline');

// 1. 创建 readline 实例
const rl = readline.createInterface({
  input: fs.createReadStream('app.log'), // 读取文件流
  crlfDelay: Infinity // 兼容 Windows/Linux 所有换行符(必加)
});

// 2. 监听每一行数据
rl.on('line', (lineStr) => {
  // lineStr 就是日志的每一行,在这里做解析/过滤/处理
  console.log('读取到一行:', lineStr);
});

// 3. 文件读取完毕
rl.on('close', () => {
  console.log('文件读取完成!');
});

关键事件说明

事件名 作用
line 每次读取到一行时触发
close 读取完毕/停止时触发
error 发生错误时触发

二、进阶用法:命令行交互(输入输出)

readline 也可以做控制台问答工具,比如让用户输入内容:

javascript 复制代码
const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,   // 控制台输入
  output: process.stdout  // 控制台输出
});

// 提问
rl.question('请输入日志文件名:', (answer) => {
  console.log('你输入的是:', answer);
  
  // 用完必须关闭
  rl.close();
});

三、处理大日志文件(防止内存爆炸)

大文件(1GB以上日志)绝对不能用 readFile ,必须用 readline 流式读取:

javascript 复制代码
const fs = require('fs');
const readline = require('readline');

let lineCount = 0;

const rl = readline.createInterface({
  input: fs.createReadStream('big.log'),
  crlfDelay: Infinity
});

rl.on('line', (line) => {
  lineCount++;
  // 逐行解析日志,比如只看错误日志
  if (line.includes('ERROR')) {
    console.log('错误日志:', line);
  }
});

rl.on('close', () => {
  console.log(`总行数:${lineCount}`);
});

四、常用 API 速查(背会这几个就够)

1. 创建实例

javascript 复制代码
const rl = readline.createInterface(options)

2. 监听行

javascript 复制代码
rl.on('line', (line) => {})

3. 关闭实例

javascript 复制代码
rl.close()

4. 暂停/恢复读取

javascript 复制代码
rl.pause()  // 暂停
rl.resume() // 恢复

五、完整实战:解析 Nginx/应用日志

javascript 复制代码
const fs = require('fs');
const readline = require('readline');

const rl = readline.createInterface({
  input: fs.createReadStream('app.log'),
  crlfDelay: Infinity
});

// 正则解析日志(示例)
const logReg = /(\d{4}-\d{2}-\d{2}) \[(\w+)\] (.*)/;

rl.on('line', (line) => {
  const res = line.match(logReg);
  if (res) {
    const [, time, level, msg] = res;
    console.log({ time, level, msg });
  }
});

rl.on('close', () => {
  console.log('解析完成');
});

六、重要注意事项(避坑)

  1. 必须处理 close:读取完成后释放资源
  2. 大文件必须用流 :fs.createReadStream + readline 是标准方案
  3. crlfDelay: Infinity :兼容所有系统换行符,一定要加
  4. 不要在 line 事件里写同步阻塞代码:会拖慢读取速度
  5. 错误处理 :生产环境建议加 error 事件监听

总结

require('readline') 就记住 3 个核心点:

  1. 逐行读取 :on('line') 是灵魂
  2. 搭配文件流 :fs.createReadStream 处理大文件
  3. 日志解析神器:Node.js 处理日志文件的标准方案

需要我给你写一个可直接用于生产环境的日志解析工具类吗?

相关推荐
jaysee-sjc6 分钟前
【苍穹外卖】Day10:定时任务与 WebSocket 实时提醒实战
java·开发语言·javascript·数据库·vue.js·websocket·网络协议
尤水就下40 分钟前
🔥说一说在线文档的 Block 架构是如何实现的
前端·javascript·架构
晓得迷路了1 小时前
栗子前端技术周刊第 151 期 - ViteConf 2026、React Router 8.5、React Native 0.88...
前端·javascript·vue.js
Ai-_Man2 小时前
Microsoft Copilot对话数据怎么导入到另外一个Microsoft Copilot账号里去?AI导出鸭
开发语言·javascript·人工智能·microsoft·chatgpt·ecmascript·copilot
小大宇2 小时前
Vue知识点8-Watch
前端·javascript·vue.js
aloha_7892 小时前
HTML、JavaScript 与 TypeScript 基础速查
javascript·typescript·html
paopaokaka_luck13 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
鶴哥只手遮天17 小时前
jQuery 4.0 源码架构与工程实践-第 10 章 尺寸、几何与显隐
前端·javascript·jquery
米米商聊19 小时前
图标能点,按钮就可用了吗?键盘、名称与收藏状态
前端·javascript
技术小甜甜21 小时前
【Cursor】Skill 被标黄色警告,怎么改成合格的 SKILL.md
开发语言·javascript·ai编程·cursor·1024程序员节·ai agent·skills