【问题标题】:Issue with output list for learnyounode #6 MAKE IT MODULARlearnyounode 的输出列表问题 #6 MAKE IT MODULAR
【发布时间】:2015-02-17 10:45:38
【问题描述】:

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

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

learnyounode 教程 6 中的问题:

  • 向您学习 Node.JS 以获得巨大的胜利!
    ────────────────────────────────────
    使其模块化
    第 6 题,共 13 题

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

创建一个程序,打印给定目录中的文件列表,按文件扩展名过滤。第一个参数是目录名,第二个参数是扩展过滤器。公关 int 文件列表(每行一个文件)到控制台。您必须使用异步 I/O。

您必须编写一个模块文件来完成大部分工作。模块必须导出一个带有三个参数的函数:目录名、文件扩展名字符串和一个回调函数,在 那个命令。文件扩展名参数必须与传递给您的程序的参数相同。即不要将其变成正则表达式或带有“。”的前缀或做任何其他事情,但将其传递给您的模块 你可以做你需要做的让你的过滤器工作。

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

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

如果错误冒泡到您的原始程序文件,只需检查它并将信息性消息打印到控制台即可。

这四件事是你的模块必须遵守的契约。

  • 导出一个函数,该函数完全采用所描述的参数。
  • 按照描述的错误或某些数据只调用一次回调。
  • 不要更改任何其他内容,例如全局变量或标准输出。
  • 处理所有可能发生的错误并将它们传递给回调。

签订合同的好处是,任何希望签订合同的人都可以使用您的模块。所以你的模块可以被其他任何学习younode的人或验证者使用,并且可以正常工作。 *

我的代码是: 模块(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)})})

【问题讨论】:

  • NVM,还是不行。

标签: javascript node.js


【解决方案1】:

我的代码遇到了同样的问题,因为需要使用 single function export 。所以不要像这样导出模块函数:

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 系列中遇到的各种问题。

【讨论】:

    【解决方案2】:

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

    module.exports =  function() {};
    

    因为他们在导出中只需要一个函数。

    你也可以这样做:

    module.exports =  FindFilesByExtension;
    
    function FindFilesByExtension(path, ext, callback) {
        //your code
    }
    

    【讨论】:

      【解决方案3】:

      这是我的解决方案,

      这是我的模块文件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);      
          }); 
      });
      

      这是我的结果截图,

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-31
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 2021-06-11
        • 1970-01-01
        • 2013-09-23
        相关资源
        最近更新 更多