节点模块在发生错误后调用回调参数

J86*_*J86 1 callback node.js node-modules

我试图在流行的LearnYouNode程序的帮助下自学Node .我正在练习6题为' Make it Modular '.基本上我必须创建一个模块,然后在我的主要需要它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;
        }
    };
};
Run Code Online (Sandbox Code Playgroud)

这是我的主要程序代码:

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();
Run Code Online (Sandbox Code Playgroud)

当我尝试通过LearnYouNode验证我的代码时,我的实现失败并显示以下消息:

在fs.readdir()发生错误后,您的附加模块文件未调用回调参数

但我认为我的计划确实如此!我错过了什么?

谢谢

mau*_*888 6

learnyounode测试期望您的模块使用包含文件列表的数组或readdir方法可能返回的错误来调用回调.因此,代替'return filename',测试期望您调用回调.此外,测试似乎对语法非常严格,因为对我来说这个代码不起作用 - >

if(err) {
  callback(true)
} else {...}
Run Code Online (Sandbox Code Playgroud)

但这有效 - >

if(err) callback(err);
else {...}
Run Code Online (Sandbox Code Playgroud)

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

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);
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

和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]);
        };
    }
})
Run Code Online (Sandbox Code Playgroud)

您可能会发现另一件有用的事情 - https://github.com/frasertweedale/learnyounode-solutions