如何从getPhotos()函数获取数组到回调函数,或者如何使用fs获取深层目录结构

问题描述 投票:0回答:1

我正在尝试收集服务器上列出的图库文件夹和图像,但是很难获取照片数组以返回结果。有人可以帮助我了解我做错了什么,因为它不会发送回数据吗?

我的代码:

    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”,“相片”: [空值]},{“ year”:“ 2011”,“相片”: [空值]},{“ year”:“ 2012”,“相片”: [空值]},{“ year”:“ 2013”​​,“相片”: [空值]},{“ year”:“ 2014”,“相片”: [空值]}]

我想返回这样的内容:

[{“ year”:“ 2004”,“相片”: [“ 1.jpg”,“ 3.jpg”,“ somatic.jpg”]},{“ year”:“ 2011”,“相片”: [“ blue.jpg”,“ green.jpg”,yellow.jpg“]},{“ year”:“ 2012”,“相片”: [“ a.jpg”,“ b.jpg”,“ c.jpg”]},{“ year”:“ 2013”​​,“相片”: [“ 2013.jpg”]},{“ year”:“ 2014”,“相片”: [“ 2014.jpg”]}]

javascript node.js fs
1个回答
0
投票

fs.readdir将为您获取目录中所有文件的名称。它不会为您提供文件。

在数组中创建对象时,您会看到此信息:

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

[属性'year'设置为字符串(2004、2011等),该字符串必须是该目录中文件的名称。这也是为什么您的照片数组始终为空的原因。存储在'file'变量中的字符串没有任何属性,因为它是字符串而不是对象。当您尝试访问file.files时,该“文件”属性不存在。

要获取文件的内容,您需要使用readdir获取的所有文件名调用类似fs.readFile的名称。

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

© www.soinside.com 2019 - 2024. All rights reserved.