Node.js使用fs.readFile读取文件为何无法匹配预期精确内容?
Node.js读取文件内容匹配失败问题解决
问题复现
使用如下代码读取datei.txt,预期文件内容为hey!,但始终进入else分支输出匹配失败:
var fs = require('fs'); fs.readFile("datei.txt", "utf-8",function(err, f){ if(f == "hey!"){ console.log("worked!"); }else{ console.log("didn't work"); } });
目标文件内容如下:
已确认文件内不存在多余空格,但始终无法完成精确内容校验。
根本原因
- 按照通用文本文件存储规范,绝大多数文本编辑器保存文件时会自动在末尾追加行结束符:类Unix系统(macOS/Linux)下为
\n(LF换行符),Windows系统下为\r\n(CRLF回车+换行符) - 代码读取到的实际内容为
hey!加末尾换行符,和判断条件里的纯字符串"hey!"并不相等 - 末尾换行符属于不可见字符,肉眼查看文件时无法直接识别,因此会误判文件内容只有
hey!
修复方案
方案1:去除首尾空白后匹配(适合确认内容首尾无合法空白的场景)
调用字符串trim()方法清除读取内容首尾的所有空白字符(包括换行、空格、制表符)后再做判断,建议使用===做严格相等判断,避免隐式类型转换带来的异常:
const fs = require('fs'); fs.readFile("datei.txt", "utf-8", function(err, f){ const fileContent = f.trim(); if(fileContent === "hey!"){ console.log("worked!"); }else{ console.log("didn't work"); } });
方案2:兼容换行符做精确匹配(适合需要严格校验文件原始内容的场景)
将两种常见的末尾换行格式纳入匹配范围,不修改读取到的原始内容:
const fs = require('fs'); fs.readFile("datei.txt", "utf-8", function(err, f){ const expectContent = "hey!"; if( f === expectContent || f === expectContent + '\n' || f === expectContent + '\r\n' ){ console.log("worked!"); }else{ console.log("didn't work"); } });
调试技巧
后续遇到同类字符串匹配不符合预期的问题,可以直接打印字符串的转义结果,快速定位隐藏的特殊字符:
// 会将换行、制表符等不可见字符转为可见的转义序列输出 console.log(JSON.stringify(f)); // 本问题场景下会输出 "hey!\n",可直接看到多出来的换行符
内容的提问来源于stack exchange,提问作者asgr
相关产品推荐
相关产品推荐

