Fehler mit ErrorBuilder sammeln, mit ERROR() protokollieren und mit AUDIT() eine Audit-Spur führen
ErrorBuildersammelt Fehler.push(message, [path], [index])fügt einen hinzu (pathist das Feld, zu dem er gehört),push(404)fügt den Text eines Statuscodes hinzu und setzt den Status der Antwort,lengthzählt sie,output()gibt sie als Array von{ error, path, index }zurück undtoString()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 mitfunction(err)zurück: Wenn er einen Fehler erhält, zeichnet er ihn unternameauf, und wenn der Fehler leer ist, tut er nichts.ERROR()ist derselbe Callback ohne Namen. Ein aufgezeichneter Fehler wird in der Konsole ausgegeben, inF.stats.errorgezählt, und die letzten zehn werden inF.errorsals{ error, name, date }aufbewahrt.AUDIT($, message, type)hängt eine JSON-Zeile anlogs/audit.logan mit wer und wo (ip,ua,urlund der Benutzer, falls vorhanden), dermessage, demtype, denparams,queryundmodelder Anfrage indata, dem Namen der Anwendung inappund der Zeit indtcreated.AUDIT('name', $, message, type)schreibt stattdessen inlogs/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);
}