【问题标题】:Store fs.stat while looping through files into an array, in Node JS在Node JS中将文件循环到数组中时存储fs.stat
【发布时间】:2018-08-07 15:18:01
【问题描述】:

我正在遍历目录中的文件并将文件详细信息存储到数组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 运行之前运行并完成。

我想我需要在这里使用一个承诺,但不确定。

【问题讨论】:

    标签: javascript node.js fs


    【解决方案1】:

    如果您想要或需要异步:

    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 一起使用。

    【讨论】:

      【解决方案2】:

      关于异步调用中的问题,您是对的。您可以使用 promise,也可以使用 fs.statSync(...),它返回一个 fs.Stats 对象并同步运行。

      files.forEach(function (file) {
          try {
              var fileStats = fs.statSync('../src/templates/' + file);
              data.push({ 
                  Name : file,
                  Path : path.join(query, file)  
              });
          } catch(e) {
              console.log(e);
          }
      });
      

      【讨论】:

        猜你喜欢
        • 2012-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-28
        • 1970-01-01
        • 2014-09-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多