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

时间:2014-09-15 07:57:32

标签: node.js callback node-modules

我试图在流行的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()

发生错误后,您的附加模块文件未调用回调参数

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

由于

2 个答案:

答案 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)
  })
}

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