Събирайте грешки с ErrorBuilder, записвайте ги с ERROR() и водете одитна следа с AUDIT()
Total.js 5 · total5@0.0.19errorsloggingaudit Изпълнено с Total.js 5
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 за API с 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.
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);
}