Función de comprensión (err, datos) devoluciones de llamada

Entonces, estoy confundido acerca de cómo funciona la devolución de llamada de la función (error, datos). ¿Es el primer argumento siempre un controlador de errores?

¿Qué pasa con los argumentos restantes si tuvieras una función similar (x, y, z, a, b, c)?

¿Cómo pasan los datos de fs.readFile desde la línea superior del código a la línea inferior del código? O, en otras palabras, ¿cómo se coloca la salida de fs.readFile en el argumento de los datos?

fs.readFile(pathToFile, function (err, **data**) {
    bufferString = **data**.toString();

Podría reemplazar la función (err, datos) con la función (x, y) y la función (x, y, z, a, b, c)

Pero solo el segundo argumento funciona (datos e y), ¿es solo la sintaxis de las devoluciones de llamada de javascript?

Por ejemplo, este es un código de trabajo para leer un archivo de forma asíncrona e imprimir la cantidad de líneas dadas un archivo:

var fs = require('fs');
var pathToFile = process.argv[2];
var bufferString, bufferStringSplit;

function counter(callback) {
  fs.readFile(pathToFile, function (err, data) {
    bufferString = data.toString();
    bufferStringSplit = bufferString.split('\n');
    callback();
  });
}

function logMyNumber() {
  console.log(bufferStringSplit.length-1);
}

counter(logMyNumber);

Respuestas a la pregunta(4)

Su respuesta a la pregunta