【问题标题】:How to read files present in array nodejs如何读取数组nodejs中存在的文件
【发布时间】:2021-05-23 19:00:38
【问题描述】:

我想知道阅读文件并在nodejs中搜索关键字sample

如果找到关键字,显示路径

const allfiles = [
  'C:\\Users\\public',
  'C:\\Users\\public\\images',
  'C:\\Users\\public\\javascripts\\index1.js',
  'C:\\Users\\public\\javascripts\\index2.js'
]


const readFile = (path, opts = 'utf8') =>
  new Promise((resolve, reject) => {
   try{
      let result=[];
      fs.readFile(path, opts, (err, data) => {
        if (err) reject(err)
        else {
          if(data.indexOf("sample")>=0){
             result.push(data);
             resolve(result);
          }
        }
      })
    }
    catch (e) {
      console.log("e", e);
     }
  })

  const run = async () => {
    allfiles.forEach(e=>{
      const s = await readFile(e);
      console.log(s);
    })
  }
run();

Expected Output
[
  'C:\\Users\\public\\javascripts\\index1.js',
  'C:\\Users\\public\\javascripts\\index2.js'
]

【问题讨论】:

  • 你得到的实际输出是什么?
  • 结果的顺序重要吗?您是否倾向于关键字最有可能在文件中的位置?文件有多大?
  • @James 感谢回复,没有结果的顺序,没有关键字的倾向,小文件

标签: javascript node.js arrays object fs


【解决方案1】:

一些提示:

  1. 如果在readFile 中找不到"sample" 会发生什么?
  2. 您目前正在将data 推送到result 而不是path
  3. 想想你想用readFile 完成什么。对我来说,您要做的是查看该文件是否包含单词"sample",如果有则返回true,如果没有则返回false。所以我将函数命名为checkIfFileHasSample 并让它返回一个布尔值。然后在你的run 函数中,在forEach 中你有path,所以这是我将路径添加到结果列表的地方。
  4. 也许您已经意识到这一点,但在您的代码示例中,run 从未真正调用。 IE。 run() 不会发生。

解决方案:

您遇到了一些语法错误和带有 async-await 的 tricky gotcharun。对于语法错误,它会随着经验而来,但我也建议使用 ESLint 来帮助您捕获它们,并确保您的代码始终正确缩进。

const fs = require("fs");
const allfiles = [
  "C:\\Users\\public",
  "C:\\Users\\public\\images",
  "C:\\Users\\public\\javascripts\\index1.js",
  "C:\\Users\\public\\javascripts\\index2.js",
];

const checkIfFileHasSample = (path, opts = "utf8") =>
  new Promise((resolve, reject) => {
    fs.readFile(path, opts, (err, data) => {
      if (err) {
        reject(err);
      } else {
        if (data.includes("sample")) {
          resolve(true);
        } else {
          resolve(false);
        }
      }
    });
  });

const run = async () => {
  const results = [];

  for (let i = 0; i < allFiles.length; i++) {
    try {
      const file = allFiles[i];
      const hasSample = await checkIfFileHasSample(file);

      if (hasSample) {
        results.push(file);
      }
    } catch (e) {
      console.log(e);
    }
  }

  console.log(results);
};
run();

【讨论】:

  • 非常感谢您的帮助,但出现错误UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: EISDIR: illegal operation on a directory,
  • 糟糕,我忘记了try-catch。我更新了我的代码以包含它。请参阅developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 了解为什么需要它。但这并不能解决您的根本问题。 illegal operation on a directory 听起来fs.readFile 有问题。它对我有用,所以可能是您的文件路径错误。
猜你喜欢
  • 2020-03-28
  • 2017-10-31
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多