Verzamel fouten met ErrorBuilder, registreer ze met ERROR() en houd een auditspoor bij met AUDIT()
ErrorBuilderverzamelt fouten.push(message, [path], [index])voegt er een toe (pathis het veld waar hij bij hoort),push(404)voegt de tekst van een statuscode toe en zet de status van het antwoord,lengthtelt ze,output()geeft ze terug als een array van{ error, path, index }entoString()voegt de berichten samen.$.invalid(builder)antwoordt met die array en de status van de builder (400, tenzij een statuscode is toegevoegd).SUCCESS(value)geeft het object van een geslaagde bewerking terug:{ success: true, value: value }.ERROR(name)geeft een callback terug voor API's metfunction(err): als hij een fout ontvangt, registreert hij die ondername, en hij doet niets als de fout leeg is.ERROR()is dezelfde callback zonder naam. Een geregistreerde fout wordt in de console afgedrukt, geteld inF.stats.error, en de laatste tien worden bewaard inF.errorsals{ error, name, date }.AUDIT($, message, type)voegt een JSON-regel toe aanlogs/audit.logmet wie en waar (ip,ua,urlen de gebruiker als die er is), hetmessage, hettype, deparams,queryenmodelvan het verzoek indata, de naam van de applicatie inappen de tijd indtcreated.AUDIT('name', $, message, type)schrijft in plaats daarvan naarlogs/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);
}