搜索

首页  >  问答  >  正文

node.js - nodejs fs.readdir的问题

从node.js + express4 写一个自己的博客网站教程中写代码,发现获取所有文件夹下的文件,最终结果如何在外面得到呢??return 返回的不是getBlogList的返回值吧?

jsfunction getBlogList(blogDir) {
  fs.readdir(blogDir, function (err, files) {
    var blogList = [];
    if (files && files.length) {
        files.forEach(function (filename) {
          //split file name and generate url...
          //...
          //create a blogItem { title: blogTitle, url: blogUrl }
          blogList.push(blogItem);
        });
    }
    return blogList;
  });
}

刚接触node,疑惑很久,请各位赐教~谢谢

天蓬老师天蓬老师2785 天前732

全部回复(2)我来回复

  • 怪我咯

    怪我咯2017-04-17 11:30:04

    你可以从下面几种方式里选个,第一个最传统,第四个最优雅(但现在用不了),第三个的优雅度仅次于第四个,过渡期间的作法,第二个使用较为广泛,而且有多种变体。

    //经典的callback写法
    function getBlogList(blogDir,callback) {
      fs.readdir(blogDir, function (err, files) {
        if(err){
            callback(err);
            return;
        }
        var blogList = [];
        if (files && files.length) {
            files.forEach(function (filename) {
              //split file name and generate url...
              //...
              //create a blogItem { title: blogTitle, url: blogUrl }
              blogList.push(blogItem);
            });
        }
        callback(null,blogList);
      });
    }
    
    // 使用方法
    
    getBlogList("/",function(err, blogList){
        //这里就可以用 blogList
    })
    
    javascript// 第二种写法,Promise
    function getBlogList(blogDir) {
        return new Promise(function(resolve,reject){
            fs.readdir(blogDir, function (err, files) {
                if(err) reject(err);
                var blogList = [];
                if (files && files.length) {
                    files.forEach(function (filename) {
                      //split file name and generate url...
                      //...
                      //create a blogItem { title: blogTitle, url: blogUrl }
                      blogList.push(blogItem);
                    });
                }
                resolve(blogList);            
            });
        })
    }
    
    // 使用方法
    
    var bloglistP= getBlogList("/");
    bloglistP.then(function(blogList){
        //这里就可以用 blogList
    })
    
    
    javascript// 第三种写法,生成器yield模式,需要co或者koa来配合,需要node>=0.11.0
    var co=require("co"),thunkify=require("thunkify");
    var readdir= thunkify(fs.readdir);
    function* getBlogList(blogDir) {
        var files= yield readdir(blogDir);
        var blogList = [];
        if (files && files.length) {
            files.forEach(function (filename) {
              //split file name and generate url...
              //...
              //create a blogItem { title: blogTitle, url: blogUrl }
              blogList.push(blogItem);
            });
        }
        return blogList;    
    }
    
    //使用方法
    co(function*(){
        //这里就可以用 blogList
        var blogList=yield getBlogList("/");
    })()
    
    javascript// ES7的async/await模式,目前node不支持,只是演示
    async function getBlogList(blogDir) {
        var files= await fs.readdir(blogDir);
        var blogList = [];
        if (files && files.length) {
            files.forEach(function (filename) {
              //split file name and generate url...
              //...
              //create a blogItem { title: blogTitle, url: blogUrl }
              blogList.push(blogItem);
            });
        }
        return blogList;    
    }
    
    // 使用方法
    // 这里就可以用 blogList
    var blogList=await getBlogList("/");
    

    回复
    0
  • PHP中文网

    PHP中文网2017-04-17 11:30:04

    楼上的是正解。 补充一个 简单粗暴的方法

    var fs = require('fs')
    function getBlogList(blogDir) {
       return fs.readdirSync(blogDir)
    }
    var files = getBlogList('/');
    console.log(files)
    

    回复
    0
  • 取消回复