如何返回这个对象,而不是logging它?

我有一个静态站点生成器,我想列出templates/partials文件夹中的所有可用部分。 我需要将部分的列表格式化为以下types的对象:

 var partials = { 'header': 'partials/header', // from './templates/partials/header.html' 'footer': 'partials/footer' // from './templates/partials/footer.html' }; 

我已经按照这个例子把这个节点脚本放在一起:

 '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); }); 

当从项目的根目录执行时,它会logging:

 { footer: 'partials/footer.html', header: 'partials/header.html' } 

这是好的,但我想返回它,不logging它。 我也有这样的想法,我写的是相当笨拙的。 所以我的问题是,如何返回对象,如何使这个更强大?

你应该提供一个callback函数:

 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. }); 

callback函数允许IOasynchronous完成; 这通常会提供很大的代码加速,因为它不需要等待IO完成。 在这种情况下,它并没有那么有用,但是callback模式在Node.js中非常常见,所以在这里使用它是一个很好的习惯。

 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); }); 

或者你可以考虑asynchronous:

 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