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之前等待它的执行。它可以工作!