@tanakadigital/js-utils
Version:
Uma biblioteca utilitária com funções de erros, integração com Discord, logs e helpers genéricos.
94 lines (81 loc) • 3.27 kB
JavaScript
import {discordService} from '../discord/index.js';
import {stringUtils} from "../utils/index.js";
import {appName as constantsAppName, defaultAppDiscordErrorsWebhookUrl} from "../utils/constants.js";
export const errorHandler = {
async middleware(err, req, res, next) {
if (!req) return next();
req.errorHandlingError = err;
const traceId = req.traceUuid || stringUtils.randomUUID();
const title = 'Error in RequestLoggingMiddlewareService.errorHandlerMiddleware';
const description = `
**Method**: ${req.method}
**URL**: ${req.url}
**TraceId**: ${traceId}
`.trim();
const appName = err.appName !== "Not found" ? err.appName : constantsAppName;
// Monta detalhes do erro
const discordMessageEmbeds = [
{
title: 'Application Name',
description: appName,
inline: false,
},
{
title: 'err.message',
description: err.message || 'No error message',
inline: false,
},
{
title: 'err.stack',
description: err.stack ? String(err.stack) : 'No stack trace',
inline: false,
},
];
// Se o erro for de uma classe que herda de CustomError, ele pode ter `discordWebhookUrls`.
// Caso não tenha ou seja vazio, não enviaremos nada.
const channelUrls = Array.isArray(err.discordWebhookUrls)
? err.discordWebhookUrls
: [defaultAppDiscordErrorsWebhookUrl];
// Define status code e retorna userMessage de forma segura
let httpStatusCode = err.httpStatusCode || 500;
let userMessage = err.userMessage || `An unexpected error occurred. TraceId: ${traceId}`;
// Exemplo de tratamento especial para uploads grandes, se for o caso
// (basta remover caso não use).
if (err.code === 'LIMIT_FILE_SIZE') {
httpStatusCode = 413;
userMessage = 'File size too large.';
}
// Adiciona info no embed
discordMessageEmbeds.push({
title: 'HTTP status code',
description: String(httpStatusCode),
inline: false,
});
discordMessageEmbeds.push({
title: 'User message',
description: userMessage,
inline: false,
});
// Responde ao client
res.status(httpStatusCode).send({
code: httpStatusCode,
message: userMessage,
});
// Log no servidor
console.error(`Request error [TraceId: ${traceId}]:`, err);
// Notifica no Discord APENAS se houver URLs
if (channelUrls.length > 0) {
try {
await discordService.sendApplicationDiscord(
title,
description,
discordMessageEmbeds,
channelUrls
);
} catch (notificationError) {
console.error('Falha ao enviar notificação ao Discord:', notificationError);
}
}
next();
}
};