This commit is contained in:
2026-02-17 09:25:04 -06:00
parent 25da1a46a8
commit df1be3b823
2 changed files with 84 additions and 42 deletions

View File

@@ -26,56 +26,55 @@ async function makeQboApiCall(requestOptions) {
// Funktion zum Aktualisieren des Tokens
const doRefresh = async () => {
console.log("🔄 QBO Token Refresh wird ausgeführt...");
console.log("🔄 QBO Token Refresh wird ausgeführt (401 Error gefangen)...");
try {
const authResponse = await client.refresh();
console.log("✅ Token erfolgreich erneuert.");
// Hier müsste man idealerweise die neuen Tokens speichern
return authResponse;
} catch (e) {
console.error("❌ Refresh fehlgeschlagen:", e);
console.error("❌ Refresh fehlgeschlagen:", e.originalMessage || e);
throw e;
}
};
// 1. Pre-Check: Wenn Token leer ist, sofort refreshen
if (!client.token.access_token) {
console.log("⚠️ Kein Access Token gefunden. Versuche sofortigen Refresh...");
await doRefresh();
}
// 2. Pre-Check: Ist Token laut Zeitstempel abgelaufen?
if (!client.isAccessTokenValid()) {
console.log("⚠️ Token ist zeitlich abgelaufen. Refresh...");
await doRefresh();
}
// --- ÄNDERUNG: KEINE VORAB-PRÜFUNG MEHR ---
// Wir vertrauen darauf, dass der Token in der .env aktuell ist (da du ihn gerade generiert hast).
// Wir entfernen client.isAccessTokenValid(), da dies oft falsch negativ ist nach Neustart.
try {
// Versuch 1: Einfach machen!
const response = await client.makeApiCall(requestOptions);
// Prüfen, ob QBO trotz HTTP 200/400 eine Fehlermeldung im Body sendet
// Prüfen, ob QBO eine Fehlermeldung im Body sendet (trotz HTTP 200/400)
const data = response.getJson ? response.getJson() : response.json;
if (data.fault && data.fault.error) {
const errorCode = data.fault.error[0].code;
// Fehler 3202 = Missing Access Token
if (errorCode === '3202') {
console.log("⚠️ QBO meldet fehlenden Token (3202). Versuche Refresh und Retry...");
// Fehler 3202 = Missing Access Token / Invalid
// Manchmal sendet QBO auch 401 im Body
if (errorCode === '3202' || errorCode === '3100') {
console.log(`⚠️ QBO meldet Token-Fehler (${errorCode}). Versuche Refresh und Retry...`);
await doRefresh();
return await client.makeApiCall(requestOptions);
}
// Anderen API-Fehler werfen, damit server.js ihn fängt
// Anderen API-Fehler werfen (z.B. Validierung)
throw new Error(`QBO API Error ${errorCode}: ${data.fault.error[0].message}`);
}
return response;
} catch (e) {
// HTTP 401 Unauthorized fangen
if (e.response?.status === 401) {
console.log("⚠️ 401 Unauthorized. Versuche Refresh und Retry...");
// HTTP 401 Unauthorized fangen -> Das ist der ECHTE Indikator, dass der Token abgelaufen ist
const isAuthError = e.response?.status === 401 || (e.authResponse && e.authResponse.response && e.authResponse.response.status === 401);
if (isAuthError) {
console.log("⚠️ 401 Unauthorized erhalten. Versuche Refresh und Retry...");
await doRefresh();
return await client.makeApiCall(requestOptions);
}
// Alle anderen Fehler weiterwerfen
throw e;
}
}