我试图在流行的LearnYouNode程序的帮助下自学Node。我正在练习6题为'模块化'。基本上我必须创建一个模块,然后在我的主program.js
中需要它并满足一些条件。
其中一个条件表明,如果出现错误,我必须调用回调函数,只传递错误对象并保留第二个参数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();
当我尝试通过LearnYouNode验证我的代码时,我的实现失败并显示消息:
在fs.readdir()
发生错误后,您的附加模块文件未调用回调参数
但我认为我的计划确实如此!我错过了什么?
由于
答案 0 :(得分:6)
learnyounode测试期望您的模块使用包含文件列表的数组或readdir方法可能返回的错误来调用回调。因此,取代&#39;返回文件名&#39;测试期望您调用回调。此外,测试似乎对语法非常严格,因为对我来说这段代码没有用 - &gt;
if(err) {
callback(true)
} else {...}
但这有效 - &gt;
if(err) callback(err);
else {...}
在这里说的是最终为我工作的代码。
Module.js - &gt;
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 - &gt;
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
答案 1 :(得分:0)
以下是您想要比较笔记的官方解决方案:
─────────────────────────────────────────────── ───────────────────────────────── 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)
})
}
─────────────────────────────────────────────── ─────────────────────────────────