learnyounode#6的输出列表问题使其模块化

时间:2014-12-18 15:30:12

标签: javascript node.js

上周四开始编码,请耐心等待我:

本教程这个问题的代码是从目录中返回一个只有扩展名的列表,而不是具有所述扩展名的文件列表,例如:如果我使用一个带有3个.js文件的目录并在命令行中使用js作为我的扩展参数,那么我会得到 1. js 2. js 3. js 作为输出,这是教程和我的代码中的问题。谢谢!

来自learnyounode教程第6号的问题:

  • 了解NODE.JS多赢! ─────────────────────────────────────
    使其模块化 练习6 of 13

此问题与前一个问题相同,但介绍了模块的概念。您需要创建两个文件来解决此问题。

创建一个程序,打印给定目录中的文件列表,并按文件扩展名进行筛选。第一个参数是目录名称,第二个参数是扩展名过滤器。镨 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)})})

3 个答案:

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

这是我的结果截图,

enter image description here