我有两个文件,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)
});
}
答案 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);
}
});
}
此外,我发现您的代码还有两个问题:
在module.js
中,您需要参数extensionRequired
。如果你仔细观察,你会发现,它甚至不能在这种方法中使用。这不是一个真正的错误,但在我看来会被视为不优雅。而是将其作为附加参数传递给printList
(更多是节点典型的IMHO方式)或者将其用作当前正在进行的全局范围变量。
在module.exports
- 来自module.js
的匿名函数中,您正在使用if (err) return err;
。我强烈建议你不要这样做。因为这是一个异步方法,所以你不能真正返回一些东西,因为在你调用这个方法后实际上可能会执行return语句。相反,将您的错误作为回调的第一个参数传递。如果没有错误,请改为通过null
,这样您就可以轻松判断是否发生了意外情况。 始终检查一下!
您的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);