Как получить массив из функции getPhotos () в функцию обратного вызова или как получить глубокую структуру каталогов с помощью fs - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь собрать папки и изображения галереи, которые перечислены на моем сервере, но мне трудно вернуть массив фотографий с результатами. Может кто-нибудь помочь мне понять, что я делаю неправильно, что он не отправляет данные обратно?

Мой код:

    module.exports.getGalleryImages = function(req, res) {
  console.log('Fetch gallery image names');
  var gallerypath = './public/assets/gallery';
  function done(err, results) {
    if (err) {
      res.status(500).json(err);
    } else {
      res.status(200).json(results);
    }
  }
  getGalleryFolders(gallerypath, done);
};

var getGalleryFolders = function(gallerypath, callback) {
  const galleryFolders = [];
  fs.readdir(gallerypath, async (err, files) => {
    if (err) {
      console.log('error: ', err);
      callback(err);
    }
    files.forEach(file => {
      let folder = { year: null, photos: [] };

      folder = { year: file, photos: [file.files] };
      galleryFolders.push(folder);
    });
    console.log(galleryFolders);
    callback(null, galleryFolders);
    // getPhotos(galleryFolders, gallerypath, callback);
  });
};

var getPhotos = function(galleryFolders, gallerypath, callback) {
  const gallery = [...galleryFolders];
  gallery.forEach(folder => {
    let subfolder = `${gallerypath}/${folder.year}`;
    fs.readdir(subfolder, (err, photos) => {
      if (err) {
        console.log('error: ', err);
        callback(err);
      }
      folder.photos = photos;
      console.log(
        `Returning folder ${folder.year} photos`,
        folder.photos.length
      );
      return folder;
      // console.log(folder);
    });
    gallery.push(folder);
    console.log('returning gallery', gallery);

    return gallery;
  });

  console.log(gallery);
  callback(null, gallery);
};

Он получает правильные папки в функции getGalleryFolders () и передает их следующей функции getPhotos (). Массив photos правильный, он просто не хочет выходить из этой функции, независимо от того, что или куда я переместил.

Я получаю результат:

[{"year": "2004", "photos": [null]}, {"year": "2011" , "photos": [null]}, {"year": "2012", "photos": [null]}, {"year": "2013", "photos": [null]}, {"year" : "2014", "photos": [null]}]

Я хочу вернуть что-то вроде этого:

[{"year": "2004", "photos": ["1.jpg", "3.jpg", "somati c .jpg"]}, {"year": "2011", "photos": ["blue.jpg", "green .jpg ", yellow.jpg"]}, {"год": "2012", "фотографии": ["a.jpg", "b.jpg", "c .jpg"]}, {"год ":" 2013 "," photos ": [" 2013.jpg "]}, {" year ":" 2014 "," photos ": [" 2014.jpg "]}]

1 Ответ

0 голосов
/ 15 января 2020

fs.readdir выдаст вам имена всех файлов в каталоге. Он не получает файлы.

Это можно увидеть, когда вы создаете объекты в вашем массиве:

folder = { year: file, photos: [file.files] }

Где свойство 'year' устанавливается в строку (2004, 2011, et c), которые должны быть именами файлов в этом каталоге. Это также, почему ваш массив фотографий всегда нулевой. Строка, хранящаяся в переменной 'file', не имеет никаких свойств, потому что это строка, а не объект. Когда вы пытаетесь получить доступ к file.files, это свойство 'files' не существует.

Чтобы получить содержимое файлов, вам нужно вызвать что-то вроде fs.readFile со всеми именами файлов, которые у вас есть ' мы получили с readdir.

https://nodejs.org/api/fs.html#fs_fs_readfile_path_options_callback

...