ForgeTotal.js 5
ro

Total.js 5

Adună erori cu ErrorBuilder, înregistrează-le cu ERROR() și păstrează o urmă de audit cu AUDIT()

Total.js 5 · total5@0.0.19 errorsloggingaudit Executată cu Total.js 5
  • ErrorBuilder adună erori. push(message, [path], [index]) adaugă una (path este câmpul căruia îi aparține), push(404) adaugă textul unui cod de stare și stabilește starea răspunsului, length le numără, output() le returnează ca un array de { error, path, index }, iar toString() unește mesajele. $.invalid(builder) răspunde cu acel array și cu starea builderului (400, dacă nu a fost adăugat un cod de stare).
  • SUCCESS(value) returnează obiectul unei operații reușite: { success: true, value: value }.
  • ERROR(name) returnează un callback pentru API-urile cu function(err): când primește o eroare, o înregistrează sub numele name, iar dacă eroarea este goală nu face nimic. ERROR() este același callback fără nume. O eroare înregistrată este afișată în consolă, numărată în F.stats.error, iar ultimele zece sunt păstrate în F.errors ca { error, name, date }.
  • AUDIT($, message, type) adaugă o linie JSON în logs/audit.log cu cine și unde (ip, ua, url și utilizatorul, când există), message, type, params, query și model ale cererii în data, numele aplicației în app și ora în dtcreated. AUDIT('name', $, message, type) scrie în schimb în 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);
}