上周四开始编码,请耐心等待我:
本教程这个问题的代码是从目录中返回一个只有扩展名的列表,而不是具有所述扩展名的文件列表,例如:如果我使用一个带有3个.js文件的目录并在命令行中使用js作为我的扩展参数,那么我会得到 1. js 2. js 3. js 作为输出,这是教程和我的代码中的问题。谢谢!
来自learnyounode教程第6号的问题:
此问题与前一个问题相同,但介绍了模块的概念。您需要创建两个文件来解决此问题。
创建一个程序,打印给定目录中的文件列表,并按文件扩展名进行筛选。第一个参数是目录名称,第二个参数是扩展名过滤器。镨 int到控制台的文件列表(每行一个文件)。您必须使用异步I / O.
您必须编写一个模块文件来完成大部分工作。模块必须导出一个带有三个参数的函数:目录名,文件扩展名字符串和回调函数 那个命令。文件扩展名参数必须与传递给程序的参数相同。即不要将其变为RegExp或带有“。”的前缀。或做任何其他事情,但将其传递给您的模块,其中y 你可以做你需要的过滤器。
必须使用惯用节点(错误,数据)约定来调用回调函数。该约定规定除非出现错误,否则传递给回调的第一个参数将为null,a 第二个将是您的数据。在这种情况下,数据将作为过滤的文件列表,作为数组。如果您收到错误,例如从你调用fs.readdir(),回调必须被称为wi 该错误,只有错误,作为第一个参数。
您不能直接从模块文件打印到控制台,只能从原始程序打印到控制台。
如果错误冒泡到原始程序文件,只需检查它并向控制台输出信息性消息。
这四件事是您的模块必须遵循的合同。
签订合同的好处是任何期望合同的人都可以使用您的模块。所以你的模块可以被其他任何做过学习者或者验证者的人使用,然后才能工作。 *
我的代码是: module(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)})})
答案 0 :(得分:2)
我的代码遇到了同样的问题,需要使用单一功能 导出。因此,不是像这样导出模块函数:
exports =module.exports={}
exports.f=function(path,ext,callbk){...};
尝试这样做:
module.exports = function (path, ext, callbk) {...};
因为它是一个单独的函数,所以你不需要指定名称为“f”的函数,就好像你在这个语句中这样做:
exports。 f = function(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 系列对其编码方式和语法非常具体,所以即使你正在以正确的方式做逻辑,你仍然无法通过,你需要你的代码来是最好的和优化的。我建议你参考nodeschool本身讨论你可能在learnyounode系列中遇到的各种问题。
答案 1 :(得分:0)
这将起作用并输出正确的结果,但他们正在寻找的是这样的:
module.exports = function() {};
因为他们只想在导出中使用一个函数。
您也可以这样做:
module.exports = FindFilesByExtension;
function FindFilesByExtension(path, ext, callback) {
//your code
}
答案 2 :(得分:0)
这是我的解决方案,
Thsi是我的模块文件 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);
});
});
这是我的结果截图,