Entendendo os retornos de chamada de função (err, dados)

Então, estou confuso sobre como funciona o retorno de chamada de função (err, dados), é o primeiro argumento sempre um manipulador de erro?

E os argumentos restantes se você tivesse algo como função (x, y, z, a, b, c)?

Como os dados de fs.readFile passam da linha superior do código para a linha inferior do código? Ou, em outras palavras, como a saída de fs.readFile é colocada no argumento de dados?

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

Eu poderia substituir função (err, dados) com função (x, y) e função (x, y, z, a, b, c)

Mas apenas o segundo argumento funciona (data e y), isso é apenas a sintaxe dos callbacks do javascript?

Por exemplo, este é o código de trabalho para ler de forma assíncrona um arquivo e imprimir o número de linhas dadas a um arquivo:

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

questionAnswers(4)

yourAnswerToTheQuestion