Fix: Bestell-E-Mail wird jetzt zuverlässig verschickt (await statt waitUntil)

context.waitUntil() lief in dieser Pages-Functions-Umgebung nicht zuverlässig zu
Ende, bevor die Anfrage beendet wurde - Bestellungen wurden korrekt gespeichert,
aber die Benachrichtigungs-Mail an [email protected] kam nie an.
Mit echten Live-Bestellungen verifiziert: mit waitUntil kam nichts bei Resend an,
mit await kam die Mail sofort und zuverlässig an.

Außerdem: "Auf Lager"-Feld im Produkt-Formular (Admin) steht jetzt über "Kategorie"
statt darunter, wie gewünscht.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
This commit is contained in:
qcigano
2026-08-03 22:48:45 +02:00
co-authored by Claude Sonnet 5
parent 989006b6a6
commit 5df0643a9d
2 changed files with 20 additions and 18 deletions
+11 -9
View File
@@ -180,19 +180,21 @@ export async function onRequestPost(context) {
);
await env.DB.batch(itemStmts);
// E-Mail-Benachrichtigung an VanVan/qciga — bewusst NICHT abgewartet (context.waitUntil
// lässt den Versand im Hintergrund fertig laufen, ohne die Antwort an die Kundschaft zu
// verzögern) und bewusst NICHT fehlerkritisch: schlägt der Versand fehl (z.B. weil noch kein
// RESEND_API_KEY hinterlegt ist), bleibt die Bestellung trotzdem ganz normal gespeichert und
// in /verwaltung/ sichtbar — nur die Benachrichtigung fehlt dann eben.
context.waitUntil(
sendeEmail(env, {
// E-Mail-Benachrichtigung an VanVan/qciga — wird bewusst ABGEWARTET (nicht per
// context.waitUntil im Hintergrund verschickt): ein Test am 03.08.2026 hat gezeigt, dass
// waitUntil() in dieser Pages-Functions-Umgebung nicht zuverlässig zu Ende lief, bevor die
// Anfrage beendet wurde (die Bestellung wurde gespeichert, aber die E-Mail kam nie an). Die
// paar hundert Millisekunden zusätzliche Wartezeit beim Abschicken der Bestellung sind ein
// kleiner Preis für "die E-Mail kommt garantiert an". Trotzdem weiterhin NICHT
// fehlerkritisch: sendeEmail() wirft nie einen Fehler, schlägt der Versand fehl (z.B. weil
// kein RESEND_API_KEY hinterlegt ist), bleibt die Bestellung trotzdem ganz normal gespeichert
// und in /verwaltung/ sichtbar — nur die Benachrichtigung fehlt dann eben.
await sendeEmail(env, {
to: BENACHRICHTIGUNGS_EMAIL,
subject: `🩵 Neue Bestellung ${bestellnummer}`,
html: bestellBenachrichtigungHtml({ bestellnummer, name, email, land, artikel, summe }),
text: `Neue Bestellung ${bestellnummer} von ${name} (${email}), ${artikel.length} Artikel, Summe ${formatPreis(summe)}. Details: https://vans-diy-bastelbedarf.pages.dev/verwaltung/`,
})
);
});
return json(201, { ok: true, id: orderId, bestellnummer });
} catch (err) {
+5 -5
View File
@@ -50,6 +50,11 @@ collections:
- { label: Englisch, name: en, widget: text }
- { label: "Schweizerdeutsch", name: ch, widget: text }
- { label: Französisch, name: fr, widget: text }
- label: "Auf Lager"
name: bestand
widget: number
value_type: int
hint: "Wie viele Stück hast du vorrätig? 0 = ausverkauft (Artikel bleibt trotzdem sichtbar)."
- label: Kategorie
name: kategorie
widget: relation
@@ -118,11 +123,6 @@ collections:
- { label: "Österreich (€)", name: at, widget: number, value_type: float, step: 0.01, required: false }
- { label: "Schweiz (€)", name: ch, widget: number, value_type: float, step: 0.01, required: false }
- { label: "Luxemburg (€)", name: lu, widget: number, value_type: float, step: 0.01, required: false }
- label: "Auf Lager"
name: bestand
widget: number
value_type: int
hint: "Wie viele Stück hast du vorrätig? 0 = ausverkauft (Artikel bleibt trotzdem sichtbar)."
- { label: Artikelnummer, name: artikelnummer, widget: string, required: false }
- { label: Material, name: material, widget: string, required: false }
- { label: "Größe / Maße", name: groesse, widget: string, required: false }