Como tratar erros da API do Triglit adequadamente
{
"statusCode": 400,
"message": "Validation failed",
"error": "Bad Request",
"details": {
"field": "name",
"message": "Name is required"
}
}
{
"statusCode": 401,
"message": "API key não fornecida. Forneça a chave no header 'X-API-Key'."
}
{
"statusCode": 403,
"message": "Tipo de chave não permitido. Este endpoint aceita apenas: secret key (sk_)."
}
{
"statusCode": 404,
"message": "Workflow not found",
"error": "Not Found"
}
{
"statusCode": 409,
"message": "Workflow with this name already exists"
}
{
"statusCode": 429,
"message": "Rate limit exceeded. Try again in 5 seconds.",
"error": "Too Many Requests",
"retryAfter": 5
}
{
"statusCode": 500,
"message": "Internal server error",
"error": "Internal Server Error"
}
async function handleRequest(requestFn) {
try {
const response = await requestFn();
if (!response.ok) {
const error = await response.json();
throw new TriglitError(error.statusCode, error.message, error);
}
return await response.json();
} catch (error) {
if (error instanceof TriglitError) {
handleTriglitError(error);
} else {
handleNetworkError(error);
}
throw error;
}
}
class TriglitError extends Error {
constructor(statusCode, message, details) {
super(message);
this.statusCode = statusCode;
this.details = details;
}
}
function handleTriglitError(error) {
switch (error.statusCode) {
case 401:
console.error('API key inválida. Verifique suas credenciais.');
break;
case 403:
console.error('Sem permissão. Use a chave secreta (sk_) para esta operação.');
break;
case 429:
const retryAfter = error.details.retryAfter || 5;
console.warn(`Rate limit excedido. Retry após ${retryAfter} segundos.`);
break;
case 500:
console.error('Erro interno do servidor. Tente novamente mais tarde.');
break;
default:
console.error(`Erro ${error.statusCode}: ${error.message}`);
}
}
async function requestWithRetry(requestFn, maxRetries = 3) {
let lastError;
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return await requestFn();
} catch (error) {
lastError = error;
// Não retry para erros 4xx (exceto 429)
if (error.statusCode >= 400 && error.statusCode < 500 && error.statusCode !== 429) {
throw error;
}
// Backoff exponencial
const delay = Math.min(1000 * Math.pow(2, attempt), 30000);
await sleep(delay);
}
}
throw lastError;
}
function validateWorkflow(data) {
const errors = [];
if (!data.name || data.name.trim().length === 0) {
errors.push('Name is required');
}
if (data.name && data.name.length > 100) {
errors.push('Name must be less than 100 characters');
}
if (errors.length > 0) {
throw new ValidationError(errors);
}
return true;
}
async function logError(error, context) {
await logger.error('Triglit API Error', {
statusCode: error.statusCode,
message: error.message,
context: context,
timestamp: new Date().toISOString()
});
}
Was this page helpful?