Node.js 使用fs.readdir&;列出目录中的文件;fs.stat和push-to数组
我试图在fs.readdir&fs.stat(NodeJS版本9.8.0)的帮助下获取目录中的文件列表,并将列表推送到JSON数组中,但没有填充。我可以用同步方法()完成这项工作,但我希望用异步方法完成这项工作。 通过谷歌搜索,我发现这与回调有关。回调完成时,响应已经发送(如果理解错误,请更正)。 以下是编写的原始代码:Node.js 使用fs.readdir&;列出目录中的文件;fs.stat和push-to数组,node.js,asynchronous,promise,stat,readdir,Node.js,Asynchronous,Promise,Stat,Readdir,我试图在fs.readdir&fs.stat(NodeJS版本9.8.0)的帮助下获取目录中的文件列表,并将列表推送到JSON数组中,但没有填充。我可以用同步方法()完成这项工作,但我希望用异步方法完成这项工作。 通过谷歌搜索,我发现这与回调有关。回调完成时,响应已经发送(如果理解错误,请更正)。 以下是编写的原始代码: var dirToRead = "allfiles"; app.get('/getDownloadFilesList', (req, res)=>{
var dirToRead = "allfiles";
app.get('/getDownloadFilesList', (req, res)=>{
var allFilesInfo = [];
fs.readdir(dirToRead,(err, files)=>{
var allFilesInfo = [];
files.forEach(function(file,index){
fs.stat(dirToRead+"/"+file, (err,stats)=>{
(err) => {return console.err(err)}
allFilesInfo.push({"Count":index,"fileName":file,"fileSize":stats.size});
});
});
});
});
然后我尝试使用promisify和NodeJS的util包,但没有成功。有人能帮忙吗
const myUtil = require('util')
var dirToRead = "allfiles";
app.get('/getDownloadFilesList', (req, res)=>{
var allFilesInfo = [];
const readdir = myUtil.promisify(fs.readdir);
const stat = myUtil.promisify(fs.stat);
readdir(dirToRead).then((files)=>{
files.forEach(function(file,index){
stat(dirToRead+"/"+file).then(function(stats){
allFilesInfo.push({"Count":index,"fileName":file,"fileSize":stats.size});
}).catch((err)=>{
(err) => {return console.err(err)}
});
});
}).catch((err)=>{
(err) => {return console.err(err)}
});
console.log(allFilesInfo);
res.send(allFilesInfo);
});
您没有等待回调中的循环,因此
res.send
发生在任何stat
s完成之前。最简单的方法是使用Promise.all()
顺便说一句,nodejs9已经过时了,你可能应该换一个更新的版本,它还有一个支持promises的
fs
模块。您需要一个包含目录和子目录中所有文件的列表吗?是的,而且我想在HTML页面中显示该列表,并提供可下载的链接。我一定会升级到最新版本。这是promise bluebird版本还是node util?fs promises api是从NodeJS v10开始提供的,并且使用本机promises。
const readdir = myUtil.promisify(fs.readdir);
const stat = myUtil.promisify(fs.stat);
app.get("/getDownloadFilesList", (req, res)=>{
readdir(dirToRead).then(files => {
Promise.all(files.map(x => stat(`${dirToRead}/${file}`)))
.then(stats => stats.map((s, i) => {
if (s.isFile()) return {"Count":i,"fileName":files[i],"fileSize":s.size});
else return null;
})
.filter(x=> x!= null)
)
.then(fileInfos => res.send(fileInfos))
.catch(e => res.sendStatus(400));
});
});