如何进行正确的Node.js错误回调?

时间:2015-06-02 13:54:01

标签: javascript node.js 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

我怎样才能使它成为“节点方式”?

2 个答案:

答案 0 :(得分:2)

您只需要一个函数参数然后调用它。然后,您可以期望函数的调用者为该参数提供回调函数。

另一个错误是您使用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]);
    }
});

希望这有帮助。

答案 1 :(得分:1)

您不会以这种方式将函数定义为参数,只需提供一个命名参数,然后将其作为函数调用,例如。

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