ForgeTotal.js 5
nl

Total.js 5

Verzamel fouten met ErrorBuilder, registreer ze met ERROR() en houd een auditspoor bij met AUDIT()

Total.js 5 · total5@0.0.19 errorsloggingaudit Uitgevoerd met Total.js 5
  • ErrorBuilder verzamelt fouten. push(message, [path], [index]) voegt er een toe (path is het veld waar hij bij hoort), push(404) voegt de tekst van een statuscode toe en zet de status van het antwoord, length telt ze, output() geeft ze terug als een array van { error, path, index } en toString() 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 met function(err): als hij een fout ontvangt, registreert hij die onder name, en hij doet niets als de fout leeg is. ERROR() is dezelfde callback zonder naam. Een geregistreerde fout wordt in de console afgedrukt, geteld in F.stats.error, en de laatste tien worden bewaard in F.errors als { error, name, date }.
  • AUDIT($, message, type) voegt een JSON-regel toe aan logs/audit.log met wie en waar (ip, ua, url en de gebruiker als die er is), het message, het type, de params, query en model van het verzoek in data, de naam van de applicatie in app en de tijd in dtcreated. AUDIT('name', $, message, type) schrijft in plaats daarvan naar logs/name.log.
controllers/reports.js
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);
}