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

Javascript 如何从getPhotos()函数到回调函数获取数组,或者如何使用fs获取深层目录结构,javascript,node.js,fs,Javascript,Node.js,Fs,我正在尝试收集服务器上列出的库文件夹和图像,但很难让照片阵列返回结果。有人能帮我理解我做错了什么,它不会把数据发回吗 我的代码: module.exports.getGalleryImages = function(req, res) { console.log('Fetch gallery image names'); var gallerypath = './public/assets/gallery'; function done(err, results) {

我正在尝试收集服务器上列出的库文件夹和图像,但很难让照片阵列返回结果。有人能帮我理解我做错了什么,它不会把数据发回吗

我的代码:

    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()。照片阵列是正确的,它似乎不想离开该功能,无论我移动了什么位置

我得到的结果是:

[ { “年份”:“2004年”, “照片”:[ 无效的 ] }, { “年份”:“2011年”, “照片”:[ 无效的 ] }, { “年份”:“2012年”, “照片”:[ 无效的 ] }, { “年份”:“2013年”, “照片”:[ 无效的 ] }, { “年份”:“2014年”, “照片”:[ 无效的 ] }]

我想退回这样的东西:

[ { “年份”:“2004年”, “照片”:[ “1.jpg”、“3.jpg”、“体细胞.jpg” ] }, { “年份”:“2011年”, “照片”:[ “blue.jpg”、“green.jpg”、“yellow.jpg” ] }, { “年份”:“2012年”, “照片”:[ “a.jpg”、“b.jpg”、“c.jpg” ] }, { “年份”:“2013年”, “照片”:[ “2013.jpg” ] }, { “年份”:“2014年”, “照片”:[ “2014.jpg” ] }]


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

在阵列中创建对象时可以看到:

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

要获取文件的内容,您需要调用类似于
fs.readFile
的东西,并使用readdir获得的所有文件名


啊,很抱歉,我应该阅读照片:[],因为我当时想运行getPhotos()函数。我已经修复了它,因此它将转到下一个函数,但它没有按预期的顺序执行。我正在使用照片列表更新文件夹之前返回图库。我猜是因为fs.readdir必须是异步的?我不知道如何将其更改为sync。哦哦哦哦!我找到了!我需要运行fs.readdirSync()而不是在我的foreach循环中使用fs.readdir,所以它会在返回gallery之前等待它的执行。它可以工作!