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

Javascript Node.js如何知道回调的第一个参数是否是错误处理程序?,javascript,node.js,express,callback,Javascript,Node.js,Express,Callback,我对Node.js是一个新手,我正试图理解它的错误优先回调风格 我很好奇函数如何知道第一个参数是否用于处理错误,何时用于处理请求,以及其他,因为这些变量名是任意的 下面是一些带有和不带有err first的代码示例 fs.readFile('/foo.txt', function(err, data) { if (err) { console.log('Ahh! An Error!'); return; } console.log(data); }); 及

我对Node.js是一个新手,我正试图理解它的错误优先回调风格

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

下面是一些带有和不带有err first的代码示例

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


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

将回调的第一个参数设置为错误代码只是node.js在其运行库中用于所有异步函数回调的一种约定,现在已经成为node.js世界中甚至在附加模块中用于所有异步回调的某种标准

您只“知道”这是因为文档而使用的约定。没有运行时检查这是否是正在使用的约定

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


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

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

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


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

这对我来说更容易一些。将对对象进行编码的函数想象为在函数上附加了最后一行类似的内容

if (callback && typeof(callback) === "function") {  
        callback(param1, param2);  
    }  
实际上,它将比这更为普遍。但是,一旦知道了这一点,您就可以使用更通用的方法(使用参数数组等)


我在这里得到的评论,当我在寻找同样的东西

顺便说一句,第一个参数不能是可选的……但它怎么知道它是一个错误检查器呢?与createServer函数一样,为什么req参数是一个请求而不是一个错误检查器?@ChangLiu-这种回调类型类似于事件通知(传入http请求的通知)。在这种情况下没有要传递的错误。事件发生并调用回调,或者事件尚未发生且未调用回调。这与异步操作的结果不同,异步操作的结果可能以错误结束。@ChangLiu-我在回答中补充了更多关于使用
err
和不使用
的回调类型的内容。
if (callback && typeof(callback) === "function") {  
        callback(param1, param2);  
    }