我试图提高我对nodeschool.io处理挑战的Node.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.")
}
}
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.")
时,没有任何反应。没有错误,它是沉默的。
这是为什么?以及如何解决这个问题?
由于
答案 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()本身以检查并在传入任何伪造参数时抛出异常。