Reputation: 704
This is my first day in NodeJS and I need to write a small a program that checks for a certain word in a list of files and folders and prints out an array of files that contains this word,
I have written the program but unfortunately i wrote it in a synchronous way, not knowing that NodeJS is asynchronous, after searching the internet I found out the problem but I can't still figure out the solution.
Here is the code that I wrote:
// Get needed arguments for running the script
// USAGE: node search [EXT] [TEXT]
var args = process.argv.slice(2);
if(args[0].length == 0 && args[1].length == 0) {
console.log("USAGE: node search [EXT] [TEXT]");
process.exit();
}
ext_args = args[0];
word_args = args[1];
var fs = require('fs'); // include file reader module
var path = process.cwd(); // get current path of script
var fileList = getFiles(path, ext_args, word_args);
console.log(fileList);
console.log("end");
/*
Function that get files recursively in a current script path
*/
function getFiles(path, ext, word) {
var fileList = [];
fs.readdir(path, function(err, items) {
for (var i=0; i<items.length; i++) {
var currentFile = items[i];
var itemPath = path + "\\" + currentFile;
if(fs.lstatSync(itemPath).isDirectory()) {
return getFiles(path + '\\' + currentFile, ext, word);
} else {
if(currentFile.endsWith(ext)) {
fileList.push(checkString(itemPath, word));
} else {
}
}
}
});
return fileList;
}
/*
Function that checks if the word exist in the text file
*/
function checkString(filePath, word) {
fs.readFile(filePath, 'utf8', function(err, data) {
//console.log("> Checking String");
if(err) throw err;
if(data.indexOf(word) >= 0) {
return filePath;
} else {
}
})
}
When I print fileList
I get it as an empty array. Can you show me how to write the recursive function in a proper way?
Upvotes: 0
Views: 163
Reputation: 5088
You need to use Async/await
or promise
to handle the asynchronous I/O operation as below:
// Get needed arguemnts for running the script
// USAGE: node search [EXT] [TEXT]
var args = process.argv.slice(2);
if (args[0].length == 0 && args[1].length == 0) {
console.log("USAGE: node search [EXT] [TEXT]");
process.exit();
}
ext_args = args[0];
word_args = args[1];
var fs = require('fs'); // include file reader module
var path = process.cwd(); // get current path of script
getFiles(path, ext_args, word_args).then((fileList) => {
console.log(fileList);
console.log("end");
});
/*
Function that get files recursivly in a current script path
*/
function getFiles(path, ext, word) {
var fileList = [];
return new Promise((resolve, reject) => {
fs.readdir(path, (err, items) => {
for (var i = 0; i < items.length; i++) {
var currentFile = items[i];
var itemPath = path + "\\" + currentFile;
if (fs.lstatSync(itemPath).isDirectory()) {
resolve(getFiles(path + '\\' + currentFile, ext, word));
} else {
if (currentFile.endsWith(ext)) {
fileList.push(checkString(itemPath, word));
} else {}
}
}
});
resolve(fileList);
})
}
/*
Function that checks if the word exist in the text file
*/
function checkString(filePath, word) {
return new Promise((resolve, reject) => {
fs.readFile(filePath, 'utf8', (err, data) => {
//console.log("> Checking String");
if (err) {
reject(err);
}
if (data.indexOf(word) >= 0) {
resolve(filePath);
}
})
})
}
Upvotes: 1