异步函数中的回调和错误处理

Callbacks and error handling in an asynchronous function

我正在努力提高对 callbacks/error handling/async 结构的理解 Node.js 在 nodeschool.io 应对挑战。

我有一个本地模块文件和一个实际程序文件。他们在这里:

my_module.js

module.exports = function(path, extension, callback) {
    var fs = require('fs');
    if (path) {
        fs.readdir(path, function(err, list) {
            if (err) return callback(err);
            var filtered = list.filter(function(item) {
                //console.log(item.split("."));
                if (item.split(".")[1] == extension) return item
            })
            callback(null, filtered);
        })
    } else {
        callback("===> Please provide a directory path.")
    }
}

program.js

var my_module = require('./my_module');
var path = process.argv[2];
var extension = process.argv[3];

my_module(path, extension, function(err, data) {
    if (err) return new Error(err);
    console.log(data.join("\n"));
})

这个程序工作得很好。但是当它应该给出错误时,它却没有。

里面my_module.js,如果path变量为空我想报错"Please provide a directory path."。奇怪的是,当我写 console.log 而不是 callback 时,我可以显示消息。但是当我将回调称为 callback("===> Please provide a directory path.") 时,什么也没有发生。没有错误,它是无声的。

这是为什么?以及如何解决这个问题?

谢谢

它是无声的,因为在你的 program.js 中,你没有使用错误。

认为 program.js 将消耗您的模块。 module.js 不知道如何处理错误。它只是将错误和数据传递给使用它的 program.js 。所以 program.js 有责任对错误做任何它想做的事。比如在控制台上记录它等等

试试这个:

my_module(path, extension, function(err, data) {
    if (err) return console.log(err);
    console.log(data.join("\n"));
})

您可能希望抛出该错误而不是 return 它,具体取决于您的应用程序的错误处理模式。

var my_module = require('./my_module');
var path = process.argv[2];
var extension = process.argv[3];

my_module(path, extension, function(err, data) {
    if (err) throw new Error(err);
    console.log(data.join("\n"));
})

作为一项建议,由于 process.arg[] 包含用户指定的输入,我实际上建议在调用 my_module()。然后可以修改 my_module() 本身以检查并在传入任何虚假参数时抛出异常。