节点模块在错误后调用callback参数

我正在试图通过受欢迎的LearnYouNode程序来教自己的Node。 我正在练习6,题为“ Make it Modular ”。 基本上我必须创build一个模块,然后在我的主要program.js需要它,并满足一些条件。

其中一个条件表示,如果发生错误,我必须调用callback函数,只传递错误对象并将第二个参数null

这是我的模块代码到目前为止:

 var fs = require('fs'); // require file stream module var pathMod = require('path'); // require path module var i = 0; // local variable var fileName = []; // local array variable module.exports = function (path, ext, callback) { return { process: function () { fs.readdir(path, callback); }, success: function (ext, files) { for(i; i < files.length; i++) { var currentFile = files[i]; var currentFileExt = pathMod.extname(currentFile); if(ext) { if(ext === currentFileExt) { fileName.push(currentFile); } } else { fileName.push(currentFile); } } return fileName; } }; }; 

这是我的主要程序代码

 var prsFiles = require('./fpmod'); // require custom module var path = process.argv[2]; // first parameter var ext = '.' + process.argv[3]; // second parameter var filtered; // local variable // call back function function callback(err, files) { if(!err) { // console.log('ext is: ' + ext) filtered = mod.success(ext, files); for (var i = 0; i < filtered.length; i++) { console.log(filtered[i]); }; } else { console.log(err); return; } } var mod = prsFiles(path, ext, callback); mod.process(); 

当我尝试通过LearnYouNodevalidation我的代码时,我的实现失败,显示消息:

来自fs.readdir()的错误后,您的附加模块文件没有调用callback参数

但我认为我的程序呢! 我错过了什么?

谢谢

learnyounodetesting期望您的模块使用包含文件列表的数组或者readdir方法可能返回的错误来调用callback。 因此,代替“返回文件名”,testing期望您调用callback。 此外,testing似乎是非常严格的语法,因为对我来说这个代码没有工作 – >

 if(err) { callback(true) } else {...} 

但是这个工作 – >

 if(err) callback(err); else {...} 

这是说这里是最终为我工作的代码。

Module.js – >

 module.exports = function(dir, ext, callback) { var fs = require('fs'); var path = require('path'); fs.readdir(dir, function(err, data) { if (err) callback(err); else { var files = []; for (var i = 0; i < data.length; i++) { if (path.extname(data[i]) == '.' + ext) { files.push(data[i]); }; }; callback(null,files); } }) } 

和Modular.js – >

 var module = require('./module'); module(process.argv[2], process.argv[3], function(err, data) { if (err) { console.log('Error!') } else { for (var i = 0; i < data.length; i++) { console.log(data[i]); }; } }) 

另一件你可能会觉得有用的东西 – https://github.com/frasertweedale/learnyounode-solutions

如果你想比较笔记,这是官方的解决scheme:

────────────────────────────────────────────────── ──────────────────────────────solution.js:

 var filterFn = require('./solution_filter.js') var dir = process.argv[2] var filterStr = process.argv[3] filterFn(dir, filterStr, function (err, list) { if (err) return console.error('There was an error:', err) list.forEach(function (file) { console.log(file) }) }) 

────────────────────────────────────────────────── ──────────────────────────────solution_filter.js:

 var fs = require('fs') var path = require('path') module.exports = function (dir, filterStr, callback) { fs.readdir(dir, function (err, list) { if (err) return callback(err) list = list.filter(function (file) { return path.extname(file) === '.' + filterStr }) callback(null, list) }) } 

────────────────────────────────────────────────── ──────────────────────────────