javascript - 在 Node JS 中将文件循环到数组中时存储 fs.stat

标签 javascript node.js fs

我循环访问目录中的文件并将文件详细信息存储到数组 data 中。如果我不尝试运行 fs.stat 来获取诸如文件创建/编辑日期之类的信息,则以下代码将填充数组:

fs.readdir('../src/templates', function (err, files) {
     if (err) {
        throw err;
      }
      var data = [];
      files
      .forEach(function (file) {
        try {
          fs.stat('../src/templates/'+file,(error,stats) => {
            data.push({ Name : file,Path : path.join(query, file)  });
          });
        } catch(e) {
          console.log(e);
        }

      });

      res.json(data);
  });
});

如果我将 data.push(...) 移到 fs.stat 之外,数组将返回文件数据。在 fs.stat 中它返回空。我认为这是一个异步问题,因为 for 循环在 fs.stat 运行之前运行并完成。

我想我需要在这里使用 promise 但不确定。

最佳答案

如果你想要或需要异步:

const fs = require("fs");
const path = require("path");
const { promisify } = require("util");

const asyncStat = promisify(fs.stat);

fs.readdir('../src/templates', async function(err, files) {
  if (err) {
    throw err;
  }
  const data = await Promise.all(files.map(async function(file) {
    try {
      const stats = await asyncStat('../src/templates/' + file);
      return { Name: file, Path: path.join(query, file), stats };
    } catch (e) {
      console.log(e);
    }
  }));
  res.json(data);
});

请注意,我使用 map 而不是 forEach 然后等待所有 Promise(async 使函数返回一个 promise)。 我还需要更改 fs.stat 以将 promise 与 util.promisify 结合使用。

关于javascript - 在 Node JS 中将文件循环到数组中时存储 fs.stat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49017779/

相关文章:

javascript - 检查数组对象中的多个值 - AngularJS

node.js - Go.CD - 在构建管道中更新 git 存储库会触发另一个构建

node.js - socket.io:如何处理 4000 个用户?

javascript - 解析 "... has no method ' 替换时 JSON 错误'"

javascript - 正确插入参数

javascript - 如何在 Unity/C# WebGL 平台中调用 async/await JavaScript 函数?

javascript - 为什么这个 jquery 事件处理程序没有按预期连接?

javascript - 如果队列不为空,Node.js Kue 自动处理作业

node.js - 异步和递归目录扫描,用于 Nodejs 和 Expressjs 中的文件列表

node.js - 原子读写文件。如何在某个位置设置EOF?