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

时间:2015-02-04 21:18:03

标签: javascript node.js asynchronous

我试图提高我对nodeschool.io处理挑战的Node.js的回调/错误处理/异步结构的理解。

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

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变量为空,我想给出错误"请提供目录路径。"。奇怪的是,当我写console.log callback的instread时,我可以显示消息。但当我将回调称为callback("===> Please provide a directory path.")时,没有任何反应。没有错误,它是沉默的。

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

由于

2 个答案:

答案 0 :(得分:5)

它是静默的,因为在你的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"));
})

答案 1 :(得分:0)

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

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()本身以检查并在传入任何伪造参数时抛出异常。