我试图以递归方式读取文件夹中的所有图像文件,然后将数据返回给浏览器。但是,即使数据显示在函数内部的控制台上,数据也不会返回到函数外部。我该如何解决?感谢任何帮助!这是我的代码:
var express = require('express');
var app = express();
var http = require('http');
var fs = require('fs');
var path = require("path");
//var flist = require('./fs-readdir-ar-fp.js');
app.use(express.static(__dirname + "/public"));
var filelist = function(dir) {
fs.readdir(dir,function(err,list){
list.forEach(function(file){
var file2 = path.resolve(dir, file);
fs.stat(file2,function(err,stats){
if(stats.isDirectory()) {
filelist(file2);
}
else {
//console.log(file2); // <-- data is displayed on console
}
})
})
})
};
flistArr = filelist('images');
console.log(flistArr); // <-- No data is displayed on console???
var server = http.createServer(function(req, res){
res.writeHead(200,{'Content-Type': 'application/json'});
res.end(JSON.stringigy(flistArr));
});
app.listen(3000);
console.log('3000 is the magic port');
答案 0 :(得分:0)
filelist
函数没有返回任何内容 - 那里没有return
个语句。
您正在使用Node标准库中的异步API,因此您必须将回调传递给每个功能,以及您在哪里登录到控制台,例如
var result = fs.stat(file2, function(err,stats){
console.log("I am a callback function")
})
// result is undefined - fs.stat doesn't return anything
尝试使用*Sync
版本的函数,例如https://nodejs.org/docs/latest/api/fs.html#fs_fs_readdirsync_path_options和https://nodejs.org/docs/latest/api/fs.html#fs_fs_statsync_path,以避免现在必须处理异步细节。
编辑:
filelist
函数的一个示例,使用标准库中的*Sync
函数编写:
const fs = require('fs');
const path = require("path");
function filelist(dir) {
let dirListing = fs.readdirSync(dir)
let filesAndSubDirListings = dirListing.map(function(file){
var fullPathToFile = path.resolve(dir, file);
let stats = fs.statSync(fullPathToFile)
if(stats.isDirectory()) {
return filelist(fullPathToFile);
}
else {
return fullPathToFile;
}
})
return filesAndSubDirListings.reduce((x, y) => ( x.concat(y)), [])
}
它或多或少与你的相同,只不过我们通过使用例如它来绕过回调。 statSync
并获取返回值。我们需要reduce
结果向下到单个数组,因为我们返回递归调用filelist
的结果。要了解它的作用,请将其取出并查看返回的内容。