如何使一个适当的Node.js错误callback?

我试图做一个适当的asynchronous函数,其中包含一个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 

我怎样才能做到“节点的方式”?

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

另一个错误是你使用while循环。 如果使用for循环并在其中声明ivariables,那么最好。 这样,你可以确保没有其他函数会触及ivariables。

此外,而不是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"); } 

这里是你的代码,使用一个固定的语法:我假设你想要callback不只是为了错误,而是为了实际的结果呢? 那么你可以这样做:

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

希望这可以帮助。

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

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