nodejs fs.readdir的问题
发布于 10 年前 作者 buzzmjx 11938 次浏览 最后一次编辑是 8 年前 来自 问答

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

function 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,疑惑很久,请各位赐教~谢谢

7 回复

由于fs.readdir为异步操作,你可以使用回调函数来做:

function getBlogList(blogDir, callback) {
  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);
        });
    }
    callback(blogList);
  });
}

getBlogList的使用是这样:

getBlogList('<BLOG_DIR>', function(list) {
// You can get blog list here.
});
function getBlogList(blogDir, callback) {
  fs.readdir(blogDir, function (err, files) {
  	if(err) return callback(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);
        });
    }
    return callback(null, blogList);
  });
}
getBlogList('dir', function(err, list){
	handle(list);
});

现在我终于知道为什么async不够用,需要promise,我也知道为什么promise也不够用了,要generator,我也知道generator为什么不够用了,要fibjs,都是异步惹得祸啊。 楼主如果需要遍历目录内的目录的话,恐怕还要加点代码。给个参考dir 看看着那一层层的回调,有的人深恶痛绝,有的却是很喜欢的,我就是喜欢的那种人。

顺便求高人用promise也实现一个,让我顺便学习一下promise的用法,回调其实倒不可怕,可怕的是那些一层又一层的错误处理,promise只懂皮毛,还望大神来答疑。

@zhengchubo 谢谢啊~解决啦

@coordcn 嘿嘿 学习啦~~谢谢

var Promise = require("bluebird"),
	readDir = Promise.promisify(require("fs").readdir);
	
readDir(blogDir)
.then(function(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;
})
.then(handle)
.catch(SyntaxError,function(e){
	//File error
})
.catch(function(e){
	//any other error
})

太棒了,遇到了同样的问题,谢谢:)

我去,踩到盗洞了。还以为 2 楼在开嘲讽。6楼支持你直接 fs.readdirSync

回到顶部