【问题标题】:Node.js with Express: Push to an empty Array returns an empty Array带有 Express 的 Node.js:推送到一个空数组返回一个空数组
【发布时间】:2019-12-29 23:22:27
【问题描述】:

我在/home/myComputer/Desktop/Research 中列出所有目录中的所有文件,然后使用 if 语句过滤它们以仅获取我想要读取并存储到数组中的 .txt 文件。一切正常,但将数据推送到数组中不起作用。当我用控制台记录它们时,它们没有返回任何值 []

我尝试了 promise 和回调函数,但它们对我不起作用,因为我不知道如何正确实现它们。

app.get('/jsonData', function(req, res) {

    /* Define Arrays */
    var theFile = [];
    var theCategory = [];
    var theContent = [];

    var walk = function(dir, done) {
      var results = [];
      fs.readdir(dir, function(err, list) {
        if (err) return done(err);
        var i = 0;
        (function next() {
          var file = list[i++];
          if (!file) return done(null, results);
          file = dir + '/' + file;
          fs.stat(file, function(err, stat) {
            if (stat && stat.isDirectory()) {
              walk(file, function(err, res) {
                results = results.concat(res);
                next();
              });
            } else {
              results.push(file);
              next();
            }
          });
        })();
      });
    };


    //walk(process.env.HOME, function(err, results) {
    walk("/home/myComputer/Desktop/Research", function(err, results) {
      if (err) throw err;
      //console.log(results);

        results.map(function(val) {
            //Get the filename
            var fileName = val.match(/[^\/]+$/).join();
            //Get the category
            var category = val.substr(48).match(/[^\/]+/);

            if (fileName == 'written-speech.txt') {
                console.log('FOUND!: ' + fileName + ' Category: ' + category) //this works

                fs.readFile(val, 'utf8', function(err, contents) {
                    console.log(contents); // this works

                    theFile.push(fileName);
                    theCategory.push(category);
                    theContent.push(contents);
                });
            }
        })

    });

        console.log(theFile); // The problem: This returns an empty Array []
        console.log(theCategory); // The problem: This returns an empty Array []
        console.log(theContent); // The problem: This returns an empty Array []

});

我希望 console.log(theFile); console.log(theCategory);console.log(theContent); 能够返回推入其中的数据。

【问题讨论】:

    标签: javascript node.js express asynchronous synchronous


    【解决方案1】:

    walk 是一个异步函数,因为fs.readdir 是一个异步方法,并且在调用 fs.readdir 的回调之前 console.log 语句正在运行(以同步方式)。

    您可以在 walk 的回调中最后控制这些变量的值。

    【讨论】:

      【解决方案2】:

      原因是 Javascript 中的许多回调是异步的,这意味着 fs.readdirfs.readFile 都是异步的,它们的回调不会立即调用,而是稍后调用(请阅读 JavaScript 中的事件循环)。因此,目前,当您记录数组时,它们是空的,并且稍后将向它们推送数据,例如在未来。为避免这种情况,您可以使用同步方法(fs.readdirSync 和 fs.readFileSync),这很丑陋,如果应用程序有很多其他异步操作,可能会导致性能问题。如果在您的情况下它只是一个读取一些数据的简单脚本,那可能没问题。 另一种首选方法是使用承诺或一些库来管理回调,例如async。如果您完全不熟悉这些概念,请阅读一些有关管理异步代码的文章,例如https://dev.to/mrm8488/from-callbacks-to-fspromises-to-handle-the-file-system-in-nodejs-56p2 进行基本了解并查看一些用例示例。

      关于您当前的版本,如果不进行大量更改,就没有简单的方法可以让它工作。最好重写它以使用我之前描述的概念。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-19
        • 2011-10-10
        • 1970-01-01
        • 2020-03-23
        • 2020-02-11
        • 2018-08-06
        • 2021-08-11
        • 2021-07-24
        相关资源
        最近更新 更多