Node JS - я не могу использовать FS.Stat синхронно

У меня есть функция 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);
  })
};

Когда вы перешли на fs.statSync, вы также переключились на использование var info = fs.statSync(path+'/'+file+'/clip.mp4'); вместо обратного вызова? Функции ввода-вывода синхронизации обычно не принимают обратные вызовы.

Paul 12.03.2018 23:12

@Paulpro Я обновляю свой код, как вы предлагаете, и он работает. Я новичок в node js. Большое спасибо за подсказку! Вы можете написать это как ответ.

sword1st 12.03.2018 23:18

Хорошо, я превратил свой комментарий в ответ.

Paul 12.03.2018 23:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
1 183
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы конвертируете из 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.

Другие вопросы по теме