Oprava: "Interni chyba serveru" pri zalozeni ticketu

Formular noveho ticketu koncil na 500 uz pri vyplnenem samotnem predmetu.

apiFetch prevadi telo na JSON sam:

  body: body !== undefined ? JSON.stringify(body) : undefined

Dialog mu ho ale predaval uz prevedene, tedy body: JSON.stringify({...}).
Druhy prevod z objektu udelal retezec a na server dorazilo "{\"subject\":...}".
express.json je ve vychozim nastaveni strict, takze retezec na nejvyssi urovni
odmitne a vyhodi vyjimku. Tataz chyba byla i ve dvou mistech helpdesku,
u zalozeni pozadavku a u komentare.

Druha polovina je hlaska. Vyjimka z parseru tela propadla do centralniho error
handleru, ktery z ni udelal 500 "Interni chyba serveru" - hlasku, ktera rika,
ze je neco spatne u nas, a posila cloveka hledat na spatnou stranu, pritom slo
o spatne polozeny dotaz. Error handler proto chyby parseru tela rozpozna
(status 400 a type zacinajici entity.) a vraci 400 s vetou o neplatnem JSONu.
Ostatni chyby zustavaji 500, jak byly.

Overeno na bezici instanci: telo zakodovane dvakrat vraci 400 s tou vetou,
opravene telo jen s predmetem vraci ticket.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
JiriUhlir
2026-09-02 14:59:02 +02:00
co-authored by Claude Opus 5
parent 79c9a729f6
commit 5984b1cb9b
4 changed files with 57 additions and 5 deletions
+18 -1
View File
@@ -214,7 +214,24 @@ if (hasWebBuild) {
}
// Centralni error handler - nic nesmi propadnout bez logu.
app.use((err: unknown, _req: Request, res: Response, _next: NextFunction) => {
app.use((err: unknown, req: Request, res: Response, _next: NextFunction) => {
/*
* Rozbite telo pozadavku neni nase chyba, je to spatne polozeny dotaz.
*
* `express.json` na nej vyhodi vyjimku, ta propadla sem a uzivatel videl
* "Interni chyba serveru" - hlasku, ktera rika, ze je neco spatne u nas,
* a poslala ho hledat na spatnou stranu. Stalo to jedno odpoledne.
*/
const status = (err as { status?: number } | null)?.status;
const type = (err as { type?: string } | null)?.type;
if (status === 400 && typeof type === 'string' && type.startsWith('entity.')) {
console.warn(`[error] ${req.method} ${req.path}: neplatne telo pozadavku (${type})`);
return res.status(400).json({
error: 'bad_request',
message: 'Tělo požadavku není platný JSON objekt.',
});
}
console.error('[error]', err);
const message = err instanceof Error ? err.message : 'Neznama chyba.';
res.status(500).json({