ForgeTotal.js 5
de

Total.js 5

Fehler mit ErrorBuilder sammeln, mit ERROR() protokollieren und mit AUDIT() eine Audit-Spur führen

Total.js 5 · total5@0.0.19 errorsloggingaudit Mit Total.js 5 ausgeführt
  • ErrorBuilder sammelt Fehler. push(message, [path], [index]) fügt einen hinzu (path ist das Feld, zu dem er gehört), push(404) fügt den Text eines Statuscodes hinzu und setzt den Status der Antwort, length zählt sie, output() gibt sie als Array von { error, path, index } zurück und toString() verbindet die Meldungen. $.invalid(builder) antwortet mit diesem Array und dem Status des Builders (400, außer es wurde ein Statuscode hinzugefügt).
  • SUCCESS(value) gibt das Objekt für eine erfolgreiche Operation zurück: { success: true, value: value }.
  • ERROR(name) gibt einen Callback für APIs mit function(err) zurück: Wenn er einen Fehler erhält, zeichnet er ihn unter name auf, und wenn der Fehler leer ist, tut er nichts. ERROR() ist derselbe Callback ohne Namen. Ein aufgezeichneter Fehler wird in der Konsole ausgegeben, in F.stats.error gezählt, und die letzten zehn werden in F.errors als { error, name, date } aufbewahrt.
  • AUDIT($, message, type) hängt eine JSON-Zeile an logs/audit.log an mit wer und wo (ip, ua, url und der Benutzer, falls vorhanden), der message, dem type, den params, query und model der Anfrage in data, dem Namen der Anwendung in app und der Zeit in dtcreated. AUDIT('name', $, message, type) schreibt stattdessen in 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);
}