所以我正在做一个nodejs教程,它要求我使用模块来过滤目录中的所有文件。我应该使用惯用的方法来处理错误。下面是我的modules.js和我的主程序.js,但程序说
Your additional module file [module.js] does not appear to pass back an
error received from fs.readdir(). Use the following idiomatic Node.js
pattern inside your callback to fs.readdir():
if (err) return
callback(err)
但我确实使用if (err)return callback(err);
有人可以指出我做错了什么或者我没有遵循的最佳做法?感谢
module.exports = function filterList(dirName, extName, callback) {
fs.readdir(dirName, function callback(err, list) {
if (err)
return callback(err);
for (var i = 0; i < list.length; i++) {
if (path.extname(list[i]) == '.' + extName) {
callback(null, list[i]);
}
};
});
}
我的program.js如下
var myMod = require('./module');
function printOut(err, result) {
if (err) {
console.log(err);
};
console.log(result);
}
myMod(process.argv[2], process.argv[3], printOut);
答案 0 :(得分:1)
这里有两个名为callback
的函数会导致意外行为。
您的主要导出函数采用参数名callback
。然后在里面定义另一个名为`callback'的函数:
function filterList(dirName, extName, callback){ // <-- callback as arg
fs.readdir(dirName, function callback(err, list) { // <-- callback defined again
if (err)
return callback(err); // <-- which function is this calling?
/* etc. */
}
当你最终return callback(err)
时,你正在调用错误的函数。你想要调用第一个 - 传递给filterList()
的那个,但第二个是在范围内。
您可以将匿名函数传递给fs.readdir
,因为您永远不需要调用它:
fs.readdir(dirName, function(err, list) {
if (err)
return callback(err); // <-- now there's only one call back
现在很明显,你正在调用正确的回调,而且它更具惯用性。
答案 1 :(得分:0)
你通过命名函数与参数相同来遮蔽你的callback
。试试这个:
module.exports = function filterList(dirName, extName, callback) {
fs.readdir(dirName, function cb(err, list) {
if (err) return callback(err);
for (var i = 0; i < list.length; i++) {
if (path.extname(list[i]) == '.' + extName) {
callback(null, list[i]);
}
};
});
}
请注意,将第二个参数符号重命名为fs.readdir
现在名为cb
,您实际上并不需要为其命名,但它确实有助于堆栈跟踪和日志记录。
另外一件事,你将在循环中调用callback
时遇到问题。有办法摆脱它,以及避免在循环中使用它的方法。