带参数NodeJS的模块

时间:2016-02-13 18:15:17

标签: javascript node.js

我有两个文件,home.js和module.js在同一目录中。 我试图做的是,当我调用从module.js导出的函数时,我试图传递名为目录的变量。

它给了我这个错误: binding.readdir(pathModule._makeLong(path),req); 输入错误:path必须是字符串。

我想弄清楚的是,当我调用module.js中的函数时,我已经从home.js传递了目录变量process.argv [2](包含路径)。这需要相同的参数(路径)。

home.js

var fs = require('fs');

var path = require('path');
var module = require('./module.js');
var directory = process.argv[2];
var extensionRequired = process.argv[3];

function printList(err, data) {
    if(err) return err;
    list.forEach(function (file) {
        if(path.extname(file) === '.' + extensionRequired) {
            console.log(file);
        }
    });
}

module(directory, extensionRequired, printList);

module.js

var fs = require('fs');
var path = require('path');

module.exports = function (directory, extensionRequired, callBack) {
    fs.readdir(directory, function(err, list) {
        if(err) return err;
        callBack(err, list)
    });
}

2 个答案:

答案 0 :(得分:2)

我认为你犯了一个错误,忘了重命名list变量:

function printList(err, data) {
    if(err) return err;
    // Here list => data
    data.forEach(function (file) {
        if(path.extname(file) === '.' + extensionRequired) {
            console.log(file);
        }
    });
}

答案 1 :(得分:0)

在名为printList的callback方法中,将第二个参数设置为data。如果您想再次访问第二个参数的值,则必须在代码中使用data或将其重新分配给另一个变量。

您的方法可能如下所示:

function printList(err, data) {
  if (err) return err;
  data.forEach(function (file) {
    if(path.extname(file) === '.' + extensionRequired) {
        console.log(file);
    }
  });
}

此外,我发现您的代码还有两个问题:

  1. module.js中,您需要参数extensionRequired。如果你仔细观察,你会发现,它甚至不能在这种方法中使用。这不是一个真正的错误,但在我看来会被视为不优雅。而是将其作为附加参数传递给printList(更多是节点典型的IMHO方式)或者将其用作当前正在进行的全局范围变量。

  2. module.exports - 来自module.js的匿名函数中,您正在使用if (err) return err;。我强烈建议你不要这样做。因为这是一个异步方法,所以你不能真正返回一些东西,因为在你调用这个方法后实际上可能会执行return语句。相反,将您的错误作为回调的第一个参数传递。如果没有错误,请改为通过null,这样您就可以轻松判断是否发生了意外情况。 始终检查一下!

  3. 您的module.js可能看起来像这样:

    var fs = require('fs');
    var path = require('path');
    
    module.exports = function (directory, callback) {
      fs.readdir(directory, function(err, list) {
        if (err)
          // Error happened, pass it to the callback 
          callback(err);
        else 
          // Everything ran smooth, send null as the error (no error)
          // and the list as the second argument.
          callback(null, list)
      });
    }
    

    然后应相应更改home.js

    var fs = require('fs');
    
    var path = require('path');
    var module = require('./module.js');
    var directory = process.argv[2];
    var extensionRequired = process.argv[3];
    
    function printList(err, data) {
      if (err) {
        console.error("An error occurred:", err);
        // Exit with an error-code of one to 
        // tell failure to the calling process and
        // prevent printing the probably 'undefined' data-variable
        process.exit(1);
      }
      data.forEach(function (file) {
        if(path.extname(file) === '.' + extensionRequired) {
          console.log(file);
        }
      });
    }
    
    // extensionRequired removed, as it is not needed
    module(directory, printList);