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.