Node.js使用fs模块读取文件后数组内容重复的问题排查
问题:读取文件内容时输出重复
这段代码原本的目的是读取project.skid文件,将所有行加载到数组后输出。例如当文件内容为“HELLO WORLD”时,预期只输出一次该内容,但实际执行时会重复输出,比如:
HELLO WORLD HELLO WORLD
代码示例
const fs = require("fs"); read() //READING THE INITAL SCRIPT function read() { fs.readFile(__dirname + '/project.skid', 'utf8', (err, data) => { if (err) { console.error(err); return; } processfile(data) }); }; //SPLITTING INTO LINES function processfile(data){ var array = fs.readFileSync('project.skid', 'utf8').split('\n'); for(i in array) { var arrayLength = array.length; for (var i = 0; i < arrayLength; i++) { console.log(array[i]); } } }
问题原因
- 重复读取文件:
read函数已经通过异步readFile获取了文件内容并传给processfile,但processfile里又用readFileSync重新读取了一遍文件,完全多余。 - 嵌套循环导致重复输出:外层用
for(i in array)遍历数组索引,内层又用for循环完整遍历整个数组。如果数组有n个元素,就会把所有内容输出n遍。比如文件内容分割后数组长度为2(含空行),就会输出2遍所有行。 - 变量未声明:外层循环的
i没有用var/let/const声明,会变成全局变量,容易引发逻辑混乱。
修复方案
方案一:利用已获取的文件内容(推荐)
直接使用read函数传入的data参数,避免重复读取文件,同时去掉嵌套循环:
const fs = require("fs"); read() function read() { fs.readFile(__dirname + '/project.skid', 'utf8', (err, data) => { if (err) { console.error(err); return; } processfile(data) }); }; function processfile(data){ // 用传入的data分割成行数组 const array = data.split('\n'); // 单次遍历数组,可选过滤空行 for (const line of array) { // 跳过空行(避免输出无内容的空行) if (line.trim()) { console.log(line); } } }
方案二:保留同步读取(不推荐异步+同步混用)
如果一定要用readFileSync,只需去掉嵌套循环即可:
function processfile(data){ const array = fs.readFileSync('project.skid', 'utf8').split('\n'); // 单次遍历 for (let i = 0; i < array.length; i++) { if (array[i].trim()) { console.log(array[i]); } } }
内容的提问来源于stack exchange,提问作者Julian Zientkowski
相关产品推荐
相关产品推荐

