Uczymy się funkcji readFile modułu filesystem, czym jest bufor oraz pisania funkcji wyższego rzędu obsługujących mechanizm error-first.

Najpierw funkcja readFile:

const fs = require("fs");
const path = require("path");

fs.readFile(path.join(__dirname, "files", "lorem.txt"), function(err, data) {
        if(err) {
            console.warn(err);
            return;
        } else {
            console.log(data);
        }
});

//<Buffer 6c 6f 72 65 6d 20 69 70 73 75 6d 20 62 6c 61 20 62 6c 61 20 62 6c 61 3b>

Zróbmy coś z tym, aby ten bufor pokazywał znaki:

fs.readFile(path.join(__dirname, "files", "lorem.txt"), function(err, data) {
        if(err) {
            console.warn(err);
            return;
        } else {
            console.log(data.toString());
        }
});

//lorem ipsum bla bla bla;

Możemy czytać znak po znaku:

fs.readFile(path.join(__dirname, "files", "lorem.txt"), function(err, data) {
        if(err) {
            console.warn(err);
            return;
        } else {
            data.forEach((char) => {
                console.log(char);
            });
        }
});

//lorem ipsum bla bla bla; <-content
//108 (letter l)
//(...)
//59 (semicolon ;)

Możemy nawet wyświetlić binarne:

fs.readFile(path.join(__dirname, "files", "lorem.txt"), function(err, data) {
        if(err) {
            console.warn(err);
            return;
        } else {
            data.forEach((char) => {
                console.log(char.toString(2));
            });
        }
});

//lorem ipsum bla bla bla; <-content
//1101100 (108 - l)
//(...)
//111011 (59 - ;)

Albo znak po znaku – to już nasza sprawa, co z tym buforem robimy:

fs.readFile(path.join(__dirname, "files", "lorem.txt"), function(err, data) {
        if(err) {
            console.warn(err);
            return;
        } else {
            data.forEach((char) => {
                console.log(String.fromCharCode(char));
            });
        }
});

//lorem ipsum bla bla bla; <-content
//l
//(...)
//;

Ok, piszemy funkcję readfile obsługującą error-first:

function readFile(file, cb) {

    fs.readFile(path.join(__dirname, "files", file), function(err, data) {

        if(err) {
            cb(err);
        } else {
            cb(null, data.toString());
        }

    });

}

Nie ma faila – pierwszy argument to null. Jest fail – error pierwszym i jedynym argumentem. Dzięki temu wystarczy sprawdzić, czy pierwszy argument istnieje:

function readFile(file, cb) {

    fs.readFile(path.join(__dirname, "files", file), function(err, data) {

        if(err) {
            cb(err);
        } else {
            cb(null, data.toString());
        }

    });

}

readFile("lorem.txt", function(err, data){
    if(err){
        console.log("Error!");
    } else {
        console.log("OK. Data: " + data);
    }
});

//OK. Data: lorem ipsum bla bla bla;

I tak się właśnie pisze funkcje obsługujące error-first.