首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习节点#6的输出列表问题使IT模块化

学习节点#6的输出列表问题使IT模块化
EN

Stack Overflow用户
提问于 2014-12-18 15:30:12
回答 3查看 1.5K关注 0票数 0

上周四刚开始编码,请听我说:

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

学习节点教程6中的问题:

  • 学习你的NODE.JS为多赢! ───────────────────────────────────── 使IT模块化 13中的练习6

这个问题和前面的问题一样,但是引入了模块的概念。您需要创建两个文件来解决这个问题。

创建一个程序,该程序打印给定目录中的文件列表,并通过文件扩展名进行过滤。第一个参数是目录名,第二个参数是扩展过滤器。Pr将文件列表(每行一个文件)发送到控制台。必须使用异步I/O。

您必须编写一个模块文件来完成大部分工作。该模块必须导出一个包含三个参数的函数:目录名称、文件名扩展名字符串和回调函数。文件名扩展参数必须与传递给您的程序相同。也就是说,不要把它变成RegExp或前缀“”。或者做任何其他的事情,但是把它传递给你的模块,在那里你可以做你需要做的事情来使你的过滤器工作。

必须使用惯用节点(err,data)约定调用回调函数。该约定规定,除非出现错误,否则传递给回调的第一个参数将为空,第二个参数将为数据。在这种情况下,数据将是您筛选的文件列表,作为一个数组。如果收到错误,例如从对fs.readdir()的调用中收到错误,则必须将该回调作为第一个参数调用,并且只能调用错误。

您不能从模块文件直接打印到控制台,而只能从原始程序打印。

在出现错误时,只需检查它并将一条信息消息打印到控制台。

这四件事是您的模块必须遵循的契约。

  • 导出一个函数,该函数接受所描述的参数。
  • 使用所描述的错误或某些数据,精确地调用回调一次。
  • 不要改变其他任何东西,比如全局变量或stdout。
  • 处理可能发生的所有错误,并将它们传递给回调。

拥有合同的好处是,您的模块可以被任何期望该合同的人使用。因此,您的模块可以被其他人使用,谁做了学习节点,或验证,并只是工作。*

我的代码是:模块(p6m.js):

代码语言:javascript
复制
 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):

代码语言:javascript
复制
   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)})})
EN

回答 3

Stack Overflow用户

发布于 2015-07-14 07:46:52

我的代码遇到了与需要使用单函数导出相同的问题。因此,与其导出像这样的模块函数,不如:

代码语言:javascript
复制
exports =module.exports={}

 exports.f=function(path,ext,callbk){...};

试着这样做:

代码语言:javascript
复制
module.exports = function (path, ext, callbk) {...};

因为它是单个函数,所以不需要指定名称为“f”的函数,就好像在下面的语句中那样:

导出.f=函数(path,ext,callbk){.};

每当您要导入模块时,它只会自动调用此函数,因为模块包含此单个函数。

你可以试试这段代码,它对我很有用。

模块代码:mymodule.js

代码语言:javascript
复制
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

代码语言:javascript
复制
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系列非常具体地说明了它的编码和语法方式,所以即使您以正确的方式执行逻辑,您仍然无法通过,您需要您的代码是最好的和优化的。我建议您参考关于节点学校本身的讨论,了解学习节点系列中可能遇到的各种问题。

票数 3
EN

Stack Overflow用户

发布于 2015-01-30 16:20:19

这将工作并输出正确的结果,但他们正在寻找的是如下所示:

代码语言:javascript
复制
module.exports =  function() {};

因为他们只需要导出中的一个函数总计。

你也可以这样做:

代码语言:javascript
复制
module.exports =  FindFilesByExtension;

function FindFilesByExtension(path, ext, callback) {
    //your code
}
票数 0
EN

Stack Overflow用户

发布于 2016-05-16 05:29:03

这是我的解决办法

这是我的模块文件filteredls.js

代码语言:javascript
复制
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的测试文件。

代码语言:javascript
复制
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);      
    }); 
});

这是我的结果截图,

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27550104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档