如何进行适当的 Node.js 错误回调?
How to make a proper Node.js error callback?
我正在尝试创建一个包含回调的适当异步函数,但显然我的方法不起作用。
这是我的代码:
var fs = require('fs');
var path = require('path');
var tmp = 0;
var i = 0;
function getFilesByExtArgs(dir, ext, function(err)){
if (err){
console.log("Error: " + err.code + " (" + err.message + ")");
return;
}
else{
fs.readdir(dir, function (err, data){
while (i <= data.length){
if (path.extname(data[i]) == ('.' + ext))
console.log(data[i]);
i++;
}
});
}
}
module.exports = getFilesByExtArgs;
当我尝试启动它时,出现以下错误:
function getFilesByExtArgs(dir, ext, function(err)){
^^^^^^^^
SyntaxError: Unexpected token function
我怎样才能做到"the node way"?
您不以这种方式将函数定义为参数,您只需提供一个命名参数,然后将其作为函数调用,例如
function getFilesByExtArgs(dir, ext, callback){
if (/* something bad */) {
callback('Error thrown');
} else {
callback();
}
}
...
getFilesByExtArgs('/my/file/path', '.txt', function(err) {
if (err) throw err;
...
});
在你的例子中,我假设你想做的是
function getFilesByExtArgs(dir, ext, callback){
fs.readdir(dir, function(err, data) {
if (err) {
callback(err);
} else {
while (i <= data.length) {
if (path.extname(data[i]) == ('.' + ext))
console.log(data[i]);
i++;
}
callback();
}
});
}
您只需要一个函数参数,然后调用它。然后您可以期望函数的调用者为该参数提供回调函数。
另一个错误是您使用了 while
循环。如果你使用 for
循环并在其中声明 i
变量,你会更好。这样,您可以确保没有其他函数会触及 i
变量。
此外,您需要 i < data.length
而不是 i <= data.length
。如果您访问 data[data.length]
,您将超出范围。
当然,在 getFilesByExtArgs
函数内部,您可能需要检查参数是否真的是一个函数。您可以使用 typeof
运算符来完成。例如:
if (typeof(callback) !== "function") {
throw new Error("The callback parameter must be a function");
}
这是您的代码,具有固定的语法:
我假设您不仅需要针对错误的回调,还需要针对实际结果的回调?然后你可以这样做:
var fs = require('fs');
var path = require('path');
function getFilesByExtArgs (dir, ext, callback) {
if (typeof(callback) !== "function") {
throw new Error("The callback parameter must be a function");
}
fs.readdir(dir, function (err, data) {
if (err) {
return callback(err);
}
var results = [];
for (var i = 0; i < data.length; i++) {
if (path.extname(data[i]) == ('.' + ext)) {
results.push(data[i]);
}
}
callback(null, results);
});
}
你可以这样称呼它:
getFilesByExtArgs('/my/file/path', 'txt', function (err, results) {
if (err) {
// Something bad happened
console.log("an error occoured!");
return;
}
// You can use the results array
console.log("printing the results:");
for (var i = 0; i < results.length; i++) {
console.log(i, results[i]);
}
});
希望对您有所帮助。
我正在尝试创建一个包含回调的适当异步函数,但显然我的方法不起作用。
这是我的代码:
var fs = require('fs');
var path = require('path');
var tmp = 0;
var i = 0;
function getFilesByExtArgs(dir, ext, function(err)){
if (err){
console.log("Error: " + err.code + " (" + err.message + ")");
return;
}
else{
fs.readdir(dir, function (err, data){
while (i <= data.length){
if (path.extname(data[i]) == ('.' + ext))
console.log(data[i]);
i++;
}
});
}
}
module.exports = getFilesByExtArgs;
当我尝试启动它时,出现以下错误:
function getFilesByExtArgs(dir, ext, function(err)){
^^^^^^^^
SyntaxError: Unexpected token function
我怎样才能做到"the node way"?
您不以这种方式将函数定义为参数,您只需提供一个命名参数,然后将其作为函数调用,例如
function getFilesByExtArgs(dir, ext, callback){
if (/* something bad */) {
callback('Error thrown');
} else {
callback();
}
}
...
getFilesByExtArgs('/my/file/path', '.txt', function(err) {
if (err) throw err;
...
});
在你的例子中,我假设你想做的是
function getFilesByExtArgs(dir, ext, callback){
fs.readdir(dir, function(err, data) {
if (err) {
callback(err);
} else {
while (i <= data.length) {
if (path.extname(data[i]) == ('.' + ext))
console.log(data[i]);
i++;
}
callback();
}
});
}
您只需要一个函数参数,然后调用它。然后您可以期望函数的调用者为该参数提供回调函数。
另一个错误是您使用了 while
循环。如果你使用 for
循环并在其中声明 i
变量,你会更好。这样,您可以确保没有其他函数会触及 i
变量。
此外,您需要 i < data.length
而不是 i <= data.length
。如果您访问 data[data.length]
,您将超出范围。
当然,在 getFilesByExtArgs
函数内部,您可能需要检查参数是否真的是一个函数。您可以使用 typeof
运算符来完成。例如:
if (typeof(callback) !== "function") {
throw new Error("The callback parameter must be a function");
}
这是您的代码,具有固定的语法: 我假设您不仅需要针对错误的回调,还需要针对实际结果的回调?然后你可以这样做:
var fs = require('fs');
var path = require('path');
function getFilesByExtArgs (dir, ext, callback) {
if (typeof(callback) !== "function") {
throw new Error("The callback parameter must be a function");
}
fs.readdir(dir, function (err, data) {
if (err) {
return callback(err);
}
var results = [];
for (var i = 0; i < data.length; i++) {
if (path.extname(data[i]) == ('.' + ext)) {
results.push(data[i]);
}
}
callback(null, results);
});
}
你可以这样称呼它:
getFilesByExtArgs('/my/file/path', 'txt', function (err, results) {
if (err) {
// Something bad happened
console.log("an error occoured!");
return;
}
// You can use the results array
console.log("printing the results:");
for (var i = 0; i < results.length; i++) {
console.log(i, results[i]);
}
});
希望对您有所帮助。