Reúna erros com ErrorBuilder, registe-os com ERROR() e mantenha um rasto de auditoria com AUDIT()
ErrorBuilderreúne erros.push(message, [path], [index])adiciona um (pathé o campo a que pertence),push(404)adiciona o texto de um código de estado e define o estado da resposta,lengthconta-os,output()devolve-os como um array de{ error, path, index }etoString()junta as mensagens.$.invalid(builder)responde com esse array e o estado do builder (400, a menos que tenha sido adicionado um código de estado).SUCCESS(value)devolve o objeto de uma operação bem-sucedida:{ success: true, value: value }.ERROR(name)devolve um callback para APIs comfunction(err): quando recebe um erro, regista-o com o nomename, e não faz nada se o erro estiver vazio.ERROR()é o mesmo callback sem nome. Um erro registado é impresso na consola, contado emF.stats.error, e os últimos dez são guardados emF.errorscomo{ error, name, date }.AUDIT($, message, type)acrescenta uma linha JSON alogs/audit.logcom quem e onde (ip,ua,urle o utilizador, quando existe), amessage, otype, osparams,queryemodeldo pedido emdata, o nome da aplicação emappe a hora emdtcreated.AUDIT('name', $, message, type)escreve emlogs/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);
}