Collecter des erreurs avec ErrorBuilder, les journaliser avec ERROR() et tenir une piste d'audit avec AUDIT()
ErrorBuildercollecte des erreurs.push(message, [path], [index])en ajoute une (pathest le champ auquel elle appartient),push(404)ajoute le texte d'un code d'état et fixe l'état de la réponse,lengthles compte,output()les renvoie sous forme d'un tableau de{ error, path, index }ettoString()assemble les messages.$.invalid(builder)répond avec ce tableau et l'état du builder (400 sauf si un code d'état a été ajouté).SUCCESS(value)renvoie l'objet d'une opération réussie :{ success: true, value: value }.ERROR(name)renvoie un callback pour les API enfunction(err): quand il reçoit une erreur, il l'enregistre sousname, et il ne fait rien si l'erreur est vide.ERROR()est le même callback sans nom. Une erreur enregistrée est affichée dans la console, comptée dansF.stats.error, et les dix dernières sont conservées dansF.errorssous la forme{ error, name, date }.AUDIT($, message, type)ajoute une ligne JSON àlogs/audit.logavec qui et où (ip,ua,urlet l'utilisateur s'il y en a un), lemessage, letype, lesparams,queryetmodelde la requête dansdata, le nom de l'application dansappet l'heure dansdtcreated.AUDIT('name', $, message, type)écrit plutôt danslogs/name.log.
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);
}