Node.js 如何知道回调的第一个参数是否是错误处理程序?

How does Node.js know if the first parameter of a callback is an error handler?

我是 Node.js 的新手,我正在努力了解它的错误优先回调风格。

我很好奇函数如何知道第一个参数是否用于处理错误以及何时用于处理请求以及什么不是,因为这些变量名称是任意的。

这里有一些代码示例,有和没有 err first

fs.readFile('/foo.txt', function(err, data) {
  if (err) {
      console.log('Ahh! An Error!');
      return;
  }
  console.log(data);
});

http.createServer(function(req, res) { ... });

我相信 Express 框架通过计算参数的数量来做到这一点,将 err 作为可选的第一个参数,但在这些情况下,只有两个参数。

将回调的第一个参数作为错误代码只是 node.js 在其 运行time 库中用于所有异步函数回调的约定,现在已成为某种程度上的标准node.js 所有异步回调的世界,即使在附加模块中也是如此。

你只 "know" 这是因为文档而被使用的约定。没有 运行-time 检查这是正在使用的约定。

仅供参考,Javascript 中的所有回调都是如此。你只知道回调的文档是什么参数。


请注意,Javascript 中的回调用于不同类型的事物。有些用途需要传达错误状态,有些则不需要。例如,一个 http 请求处理程序是一个回调,但没有错误与回调通信。要么有传入的 http 请求并调用回调,要么没有传入的 http 请求且不调用回调。没有与该类型的回调通信的错误状态,因此没有传递给它的错误参数。

但是,几乎所有表示异步操作完成的回调都可能以错误结束,因此必须将 err 参数传递给回调,以便回调知道发生了什么以及异步操作是否已完成成功与否。

回调有两种截然不同的用途。只有需要传达可能的错误状态的回调才会包含您询问的 err 参数。

例如,事件处理程序回调(当某些事件发生时调用的回调 - 如浏览器中的点击、传入的 http 请求、传入的 webSocket 数据包、计时器事件)通常没有错误状态与他们相关联,因此他们不使用 err 参数约定。

这让我轻松了一些。将对对象进行编码的函数想象成在函数上附加了这样的最后一行。

if (callback && typeof(callback) === "function") {  
        callback(param1, param2);  
    }  

实际上它会比这更普遍。但是一旦你知道它在那里,你就可以使用更通用的方法(使用参数数组等)。

当我在寻找同样的东西时,我在评论中看到了这个。 http://www.impressivewebs.com/callback-functions-javascript/