Συλλέξτε σφάλματα με το ErrorBuilder, καταγράψτε τα με το ERROR() και κρατήστε ίχνος ελέγχου με το AUDIT()
- Το
ErrorBuilderσυλλέγει σφάλματα. Τοpush(message, [path], [index])προσθέτει ένα (τοpathείναι το πεδίο στο οποίο ανήκει), τοpush(404)προσθέτει το κείμενο ενός κωδικού κατάστασης και ορίζει την κατάσταση της απάντησης, τοlengthτα μετράει, τοoutput()τα επιστρέφει ως πίνακα{ error, path, index }και τοtoString()ενώνει τα μηνύματα. Το$.invalid(builder)απαντά με αυτόν τον πίνακα και την κατάσταση του builder (400 εκτός αν προστέθηκε κωδικός κατάστασης). - Το
SUCCESS(value)επιστρέφει το αντικείμενο μιας επιτυχημένης λειτουργίας:{ success: true, value: value }. - Το
ERROR(name)επιστρέφει ένα callback για APIs μεfunction(err): όταν λάβει σφάλμα το καταγράφει με το όνομαname, και δεν κάνει τίποτα αν το σφάλμα είναι κενό. ΤοERROR()είναι το ίδιο callback χωρίς όνομα. Ένα καταγεγραμμένο σφάλμα εκτυπώνεται στην κονσόλα, μετριέται στοF.stats.errorκαι τα δέκα τελευταία κρατούνται στοF.errorsως{ error, name, date }. - Το
AUDIT($, message, type)προσθέτει μια γραμμή JSON στοlogs/audit.logμε το ποιος και πού (ip,ua,urlκαι ο χρήστης όταν υπάρχει), τοmessage, τοtype, ταparams,queryκαιmodelτου αιτήματος στοdata, το όνομα της εφαρμογής στοappκαι την ώρα στοdtcreated. ΤοAUDIT('name', $, message, type)γράφει αντί γι' αυτό στοlogs/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);
}