上周四刚开始编码,请听我说:
本教程中这个问题的代码是从目录返回一个扩展名列表,而不是返回具有上述扩展名的文件列表,例如,如果我在命令行中使用带有3个.js文件的目录,并使用js作为扩展名参数,那么我将得到1.js2.js3.js作为输出,下面是教程和我的代码中的问题。谢谢!
学习节点教程6中的问题:
这个问题和前面的问题一样,但是引入了模块的概念。您需要创建两个文件来解决这个问题。
创建一个程序,该程序打印给定目录中的文件列表,并通过文件扩展名进行过滤。第一个参数是目录名,第二个参数是扩展过滤器。Pr将文件列表(每行一个文件)发送到控制台。必须使用异步I/O。
您必须编写一个模块文件来完成大部分工作。该模块必须导出一个包含三个参数的函数:目录名称、文件名扩展名字符串和回调函数。文件名扩展参数必须与传递给您的程序相同。也就是说,不要把它变成RegExp或前缀“”。或者做任何其他的事情,但是把它传递给你的模块,在那里你可以做你需要做的事情来使你的过滤器工作。
必须使用惯用节点(err,data)约定调用回调函数。该约定规定,除非出现错误,否则传递给回调的第一个参数将为空,第二个参数将为数据。在这种情况下,数据将是您筛选的文件列表,作为一个数组。如果收到错误,例如从对fs.readdir()的调用中收到错误,则必须将该回调作为第一个参数调用,并且只能调用错误。
您不能从模块文件直接打印到控制台,而只能从原始程序打印。
在出现错误时,只需检查它并将一条信息消息打印到控制台。
这四件事是您的模块必须遵循的契约。
拥有合同的好处是,您的模块可以被任何期望该合同的人使用。因此,您的模块可以被其他人使用,谁做了学习节点,或验证,并只是工作。*
我的代码是:模块(p6m.js):
var fs=require('fs'), ph=require('path'), exports =module.exports={}
exports.f=function(path,ext,callbk){
fs.readdir(path,function(err,files){
if(err){
return callbk(err,null)
}
files=files.filter(
function(file){
return ph.extname(file)==="."+ext
}
)
return callbk(null,files)}
)}我的程序(p6.js):
var p6m=require('./p6m'), path=process.argv[2], ext=process.argv[3]
p6m.f(path, ext, function(err,files){
if(err){return console.log.error('Error occured:', err)};
files.forEach(function(file){
console.log(file)})})发布于 2015-07-14 07:46:52
我的代码遇到了与需要使用单函数导出相同的问题。因此,与其导出像这样的模块函数,不如:
exports =module.exports={}
exports.f=function(path,ext,callbk){...};试着这样做:
module.exports = function (path, ext, callbk) {...};因为它是单个函数,所以不需要指定名称为“f”的函数,就好像在下面的语句中那样:
导出.f=函数(path,ext,callbk){.};
每当您要导入模块时,它只会自动调用此函数,因为模块包含此单个函数。
你可以试试这段代码,它对我很有用。
模块代码:mymodule.js
var fs = require('fs');
var ph= require('path');
module.exports = function (path, ext, callbk) {
var pathio = "." + ext;
fs.readdir(path, function (err, files) {
if (err)
return callbk(err);
else {
var listf = []; //listf is the resultant list
for (var i = 0; i < files.length; i++) {
if (ph.extname(files[i]) === pathio) {
listf.push(files[i]);
}
}
callbk(null, listf);
}
});
}程序代码:moduletest.js
var mod = require('./mymodule');
mod(process.argv[2], process.argv[3], function (err, listf) {
if (err) {
console.log('Error!')
} else {
for (var i = 0; i < listf.length; i++) {
console.log(listf[i]);
}
}
});请记住,learnyounode系列非常具体地说明了它的编码和语法方式,所以即使您以正确的方式执行逻辑,您仍然无法通过,您需要您的代码是最好的和优化的。我建议您参考关于节点学校本身的讨论,了解学习节点系列中可能遇到的各种问题。
发布于 2015-01-30 16:20:19
这将工作并输出正确的结果,但他们正在寻找的是如下所示:
module.exports = function() {};因为他们只需要导出中的一个函数总计。
你也可以这样做:
module.exports = FindFilesByExtension;
function FindFilesByExtension(path, ext, callback) {
//your code
}发布于 2016-05-16 05:29:03
这是我的解决办法
这是我的模块文件filteredls.js
var fs = require('fs');
var path = require('path');
module.exports = function filterFiles(folder, extension, callback) {
fs.readdir(folder, function(err, files) {
if(err) return callback(err);
var filesArray = [];
files.forEach(function(file) {
if(path.extname(file) === "."+extension) {
filesArray.push(file);
}
});
return callback(null, filesArray);
});
}这是我用于读取模块modular.js的测试文件。
var ff = require('./filteredls.js');
ff(process.argv[2], process.argv[3], function(err, data) {
if(err)
return console.error(err);
data.forEach(function(file) {
console.log(file);
});
});这是我的结果截图,

https://stackoverflow.com/questions/27550104
复制相似问题