Hibák gyűjtése ErrorBuilderrel, naplózásuk ERROR()-ral és audit nyom vezetése AUDIT()-tal
- Az
ErrorBuilderhibákat gyűjt. Apush(message, [path], [index])hozzáad egyet (apatha mező, amelyhez tartozik), apush(404)hozzáadja egy állapotkód szövegét és beállítja a válasz állapotát, alengthmegszámolja őket, azoutput(){ error, path, index }tömbként adja vissza őket, atoString()pedig összefűzi az üzeneteket. A$.invalid(builder)ezzel a tömbbel és a builder állapotával válaszol (400, hacsak nem adtak hozzá állapotkódot). - A
SUCCESS(value)egy sikeres művelet objektumát adja vissza:{ success: true, value: value }. - Az
ERROR(name)egy callbacket ad vissza afunction(err)típusú API-khoz: ha hibát kap,namenéven feljegyzi, és nem tesz semmit, ha a hiba üres. AzERROR()ugyanez a callback név nélkül. A feljegyzett hiba megjelenik a konzolon, beleszámít azF.stats.error-ba, az utolsó tíz pedig azF.errors-ban marad{ error, name, date }alakban. - Az
AUDIT($, message, type)egy JSON sort fűz alogs/audit.log-hoz azzal, hogy ki és hol (ip,ua,url, és a felhasználó, ha van), amessage, atype, a kérésparams,queryésmodelértékei adatamezőben, az alkalmazás neve azappmezőben és az idő adtcreatedmezőben. AzAUDIT('name', $, message, type)helyette alogs/name.logfájlba ír.
exports.install = function() {
ROUTE('GET /builder/', builder);
ROUTE('GET /builder404/', builder404);
ROUTE('GET /success/', success);
ROUTE('GET /error/', error);
ROUTE('GET /audit/', audit);
ROUTE('GET /audit-read/{name}/', auditread);
};
function builder($) {
const errors = new ErrorBuilder();
errors.push('Name is required', 'name');
errors.push('Age is too low', 'age', 2);
$.invalid(errors);
}
function builder404($) {
const errors = new ErrorBuilder();
errors.push(404);
$.invalid(errors);
}
function success($) {
$.json(SUCCESS('saved'));
}
function error($) {
const before = F.stats.error;
ERROR('mypart')('Something broke');
ERROR('mypart')(null);
ERROR()('Without a name');
$.json({ counted: F.stats.error - before, last: F.errors.slice(-2).map(n => ({ error: n.error, name: n.name || null, date: n.date instanceof Date || typeof n.date === 'string' })) });
}
function audit($) {
AUDIT($, 'Opened the report', 'info');
AUDIT('security', $, 'Checked the access');
$.json({ ok: true });
}
function auditread($) {
setTimeout(function() {
const lines = require('fs').readFileSync(PATH.logs($.params.name + '.log'), 'utf8').trim().split('\n');
$.json(lines.map(n => JSON.parse(n)));
}, 300);
}