У меня есть функция node js. Он проверяет все папки на наличие определенных файлов и сравнивает дату последней записи каждого файла с датой запроса. Если есть подходящий, я хочу сохранить путь к этой папке. На самом деле моя функция работает, но она делает управление датой асинхронно. Я пробую fs.statSync, но это тоже не сработало. Когда я использую statSync, я не могу получить вывод журнала консоли.
console.info('Collected Files - OutsideIF : ' + filesCollected);
он мне ничего не покажет. Даже не пустой. И мой последний консольный журнал возвращается пустым.
Я добавляю комментарии к своему коду. Вот моя функция:
var scanFolders = function(){
// Listing all directories and files in path
fs.readdir(path,(err,files) => {
// Creating Variable For Record Result
var filesCollected = "";
// Loop for every directory and file
files.forEach(file=>{
// If current path is a directory
if (fs.lstatSync(path+'/'+file).isDirectory()){
// Check that directory for certain files
if ((fs.existsSync(path+'/'+file+'/'+'LineChart.html')) && (fs.existsSync(path+'/'+file+'/'+'clip.mp4'))){
// Check last write time for clip mp4
fs.stat(path+'/'+file+'/clip.mp4', function (err, info){
var day = info.mtime.getDate();
var month = info.mtime.getMonth();
var year = info.mtime.getFullYear();
if (day < 10) {day = "0" + day;}
if (month < 10) {month = "0" + month;}
// Temp Date variable for compare them
var tempDate = day + '-' + month + '-' + year;
// I can see this console log it's working perfectly
console.info('file date : ' + tempDate + ' FileName : ' + file);
// Compare dates and if they are equal take that path to filesCollected Variable
if (tempDate == '24-01-2018'){
filesCollected += file + ';';
// If i check this code block with console log it's working too.
}
// Last loop from this "Collected Files - OutsideIF" log is actually what
// i want. I put this for control code flow. But it's returning after
// "Collected Files :" console log below. So i can't return that data
console.info('Collected Files - OutsideIF : ' + filesCollected);
});
//end
}
}
});
//It's return empty because this code executing first. So i guess fs.stat is async
console.info('Collected Files : ' + filesCollected);
})
};
@Paulpro Я обновляю свой код, как вы предлагаете, и он работает. Я новичок в node js. Большое спасибо за подсказку! Вы можете написать это как ответ.
Хорошо, я превратил свой комментарий в ответ.





Когда вы конвертируете из fs.stat в fs.statSync, вам нужно использовать его возвращаемое значение вместо передачи обратного вызова. НАПРИМЕР.
fs.stat(path, function (err, info){
...
} );
приблизительно эквивалентен *:
try {
const info = fs.statSync(path);
...
} catch ( err ) {
}
*aside from the differences between asynchronous and synchronous,
and using const means info can't be reassigned within the try block.
Когда вы перешли на
fs.statSync, вы также переключились на использованиеvar info = fs.statSync(path+'/'+file+'/clip.mp4');вместо обратного вызова? Функции ввода-вывода синхронизации обычно не принимают обратные вызовы.