You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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]);
}
}
} 

问题原因

  1. 重复读取文件:read函数已经通过异步readFile获取了文件内容并传给processfile,但processfile里又用readFileSync重新读取了一遍文件,完全多余。
  2. 嵌套循环导致重复输出:外层用for(i in array)遍历数组索引,内层又用for循环完整遍历整个数组。如果数组有n个元素,就会把所有内容输出n遍。比如文件内容分割后数组长度为2(含空行),就会输出2遍所有行。
  3. 变量未声明:外层循环的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:30:50