callback和asynchronous函数中的error handling

我试图提高我对Node.js的callback/error handling/asynchronous结构的了解,以解决nodechool.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里面,如果pathvariables是空的,我想给出错误“请提供一个目录path”。 奇怪的是,当我编写console.logcallback函数时,我可以显示消息。 但是当我将callback称为callback("===> Please provide a directory path.")没有任何反应。 没有错误,它是沉默的。

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

谢谢

这是沉默的,因为在你的program.js中,你没有消耗错误。

认为program.js将会消耗你的模块。 module.js不知道如何处理错误。 它只是将错误和数据传递给你的程序。 所以它负责编程.js做任何事情的错误。 就像在控制台上login一样

尝试这个:

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

您可能想抛出该错误而不是返回它,这取决于您的应用程序的error handling模式。

 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")); }) 

作为一个build议,由于process.arg []包含用户指定的input,我实际上build议在调用my_module()之前用用户友好的(漂亮的)错误消息(而不是exception)进行参数检查。 my_module()本身可以被修改来检查并抛出一个exception,如果任何伪参数被传入。