无法从节点js函数获取数据

时间:2018-04-22 18:03:16

标签: node.js

我试图以递归方式读取文件夹中的所有图像文件,然后将数据返回给浏览器。但是,即使数据显示在函数内部的控制台上,数据也不会返回到函数外部。我该如何解决?感谢任何帮助!这是我的代码:

    var express = require('express');
  var app = express();
  var http = require('http');
  var fs = require('fs');
  var path = require("path");
  //var flist = require('./fs-readdir-ar-fp.js');
  app.use(express.static(__dirname + "/public"));

  var filelist = function(dir) {      
    fs.readdir(dir,function(err,list){
        list.forEach(function(file){
             var file2 = path.resolve(dir, file);
            fs.stat(file2,function(err,stats){
                if(stats.isDirectory()) {
                    filelist(file2);
                }
                else {                  
                    //console.log(file2); // <-- data is displayed on console

                }
            })            
        })      
    })   
};
  flistArr = filelist('images');
  console.log(flistArr); // <-- No data is displayed on console???

var server = http.createServer(function(req, res){
    res.writeHead(200,{'Content-Type': 'application/json'});
    res.end(JSON.stringigy(flistArr));
});

app.listen(3000);
console.log('3000 is the magic port');

1 个答案:

答案 0 :(得分:0)

filelist函数没有返回任何内容 - 那里没有return个语句。

您正在使用Node标准库中的异步API,因此您必须将回调传递给每个功能,以及您在哪里登录到控制台,例如

var result = fs.stat(file2, function(err,stats){
    console.log("I am a callback function")
})
// result is undefined - fs.stat doesn't return anything

尝试使用*Sync版本的函数,例如https://nodejs.org/docs/latest/api/fs.html#fs_fs_readdirsync_path_optionshttps://nodejs.org/docs/latest/api/fs.html#fs_fs_statsync_path,以避免现在必须处理异步细节。

编辑:

filelist函数的一个示例,使用标准库中的*Sync函数编写:

const fs = require('fs');                                                          
const path = require("path");                                                      

function filelist(dir) {                                                           
    let dirListing = fs.readdirSync(dir)                                           
    let filesAndSubDirListings = dirListing.map(function(file){                    
        var fullPathToFile = path.resolve(dir, file);                              
        let stats = fs.statSync(fullPathToFile)                                    
        if(stats.isDirectory()) {                                                  
            return filelist(fullPathToFile);                                       
        }                                                                          
        else {                                                                     
            return fullPathToFile;                                                 
        }                                                                          
    })                                                                             
    return filesAndSubDirListings.reduce((x, y) => ( x.concat(y)), [])             
}

它或多或少与你的相同,只不过我们通过使用例如它来绕过回调。 statSync并获取返回值。我们需要reduce结果向下到单个数组,因为我们返回递归调用filelist的结果。要了解它的作用,请将其取出并查看返回的内容。