我有一个静态站点生成器,我想在其中列出templates/partials
文件夹中的所有可用部分。我需要将partials列表格式化为以下类型的对象:
var partials = {
'header': 'partials/header', // from './templates/partials/header.html'
'footer': 'partials/footer' // from './templates/partials/footer.html'
};
我已按照this example整理此节点脚本:
'use strict';
/**
* Dependencies
*/
var fs = require("fs");
var path = require("path");
var p = 'templates/partials';
/**
* Scan folder and return object with partials
*/
fs.readdir(p, function (err, files) {
var obj = {};
if (err) {
throw err;
};
for (var i = 0; i < files.length; i++) {
obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
};
console.log(obj);
});
从项目的根目录执行时,它会记录:
{ footer: 'partials/footer.html',
header: 'partials/header.html' }
哪个好,但我想退回它,而不是记录它。我也明白我写的东西是相当笨重的。所以我的问题是,如何返回对象,以及如何使其更加健壮?
答案 0 :(得分:1)
您应该提供回调函数:
function readfiles(callback) {
fs.readdir(p, function (err, files) {
var obj = {};
if (err) {
throw err;
};
for (var i = 0; i < files.length; i++) {
obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
};
callback(obj);
});
}
这将使用如下:
readfiles(function(files) {
// Do stuff with files here.
});
回调函数允许IO异步完成;这通常为代码提供了很大的加速,因为它不需要等待IO完成。在这种情况下,它不是那么有用,但回调模式在Node.js中很常见,因此在这里使用它是一种很好的做法。
答案 1 :(得分:1)
var results = fs.readdir(p, function(err, files) {
var obj = {};
if (err) {
throw err;
};
for (var i = 0; i < files.length; i++) {
obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
};
// derectly deal with it here
deal(obj);
});
或者你可以考虑异步:
async.waterfall([
function(cb) {
fs.readdir(p, cb)
},
function(files, cb) {
for (var i = 0; i < files.length; i++) {
obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
}
cb(null, obj);
}
],
function(err, obj) {
if (err) {
throw err;
}
// do somethin else
}
);
或者您想要同步返回:
var files = fs.readdirSync(p);
for (var i = 0; i < files.length; i++) {
obj[path.basename(files[i], '.html')] = 'partials/' + files[i];
};
// here's your obj
obj;
阅读文档了解更多详情:http://nodejs.org/api/fs.html