Node.js 使用fs.readdir&;列出目录中的文件;fs.stat和push-to数组

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)=>{

我试图在fs.readdir&fs.stat(NodeJS版本9.8.0)的帮助下获取目录中的文件列表,并将列表推送到JSON数组中,但没有填充。我可以用同步方法()完成这项工作,但我希望用异步方法完成这项工作。 通过谷歌搜索,我发现这与回调有关。回调完成时,响应已经发送(如果理解错误,请更正)。 以下是编写的原始代码:

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));
  });
});