nodejs fs.readdir的问题 - CNode技术社区

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

从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

回到顶部

AltStyle によって変換されたページ (->オリジナル) /