异步函数中的回调和错误处理
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() 本身以检查并在传入任何虚假参数时抛出异常。
我正在努力提高对 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() 本身以检查并在传入任何虚假参数时抛出异常。