如何读取数组nodejs中存在的文件
How to read files present in array nodejs
我想知道在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'
]
一些提示:
- 如果在
readFile
中找不到 "sample"
会怎样?
- 您当前将
data
推入 result
而不是 path
。
- 想想你想用
readFile
完成什么。对我来说,你想要做的是查看该文件是否有单词 "sample"
,如果有 return true
,如果没有 return false
。所以我将函数命名为 checkIfFileHasSample
并将其设为 return 布尔值。然后在你的 run
函数中,在 forEach
中你有 path
,所以这是我将路径添加到结果列表的地方。
- 也许您已经意识到这一点,但
run
在您的代码示例中实际上从未 调用 。 IE。 run()
不会发生。
解决方案:
你有一些语法错误和 与 run
的异步等待。对于语法错误,它会随着经验而来,但我也建议使用 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();
我想知道在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'
]
一些提示:
- 如果在
readFile
中找不到"sample"
会怎样? - 您当前将
data
推入result
而不是path
。 - 想想你想用
readFile
完成什么。对我来说,你想要做的是查看该文件是否有单词"sample"
,如果有 returntrue
,如果没有 returnfalse
。所以我将函数命名为checkIfFileHasSample
并将其设为 return 布尔值。然后在你的run
函数中,在forEach
中你有path
,所以这是我将路径添加到结果列表的地方。 - 也许您已经意识到这一点,但
run
在您的代码示例中实际上从未 调用 。 IE。run()
不会发生。
解决方案:
你有一些语法错误和 run
的异步等待。对于语法错误,它会随着经验而来,但我也建议使用 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();