GraphQL.cz/Fórum/Jak nejlépe zpracovat chyby v GraphQL serveru?

Jak nejlépe zpracovat chyby v GraphQL serveru?

Zdravím všechny, mám dotaz ohledně zpracování chyb v GraphQL serverech. Nedávno jsem začal pracovat na projektu, který využívá GraphQL a narazil jsem na pár problémů týkajících se toho, jak správně reagovat na chyby, které se objevují při dotazech nebo mutacích. Mám pocit, že to není úplně jasné, jak by měly být chyby strukturovány a co všechno by mělo být zahrnuto v odpovědi, když dojde k nějaké chybě. Zajímalo by mě, jestli existují nějaké osvědčené postupy pro zpracování chyb, které by mi mohly pomoci. Také bych rád věděl, zda je dobré vracet různé typy chyb a jak je efektivně logovat pro pozdější analýzu. Jakým způsobem byste doporučili informovat klienta o tom, co se stalo, aby měl dostatečné informace k tomu, aby mohl případně situaci vyřešit? Bylo by fajn, kdybyste sem dali i příklady kódu, pokud máte nějaké zkušenosti s tímto tématem. Díky moc za pomoc!

144 slov
1.4 minut čtení
9. 4. 2024
Blanka Netolická

K chybám v GraphQL je fajn mít nějakou strukturu. Obecně se doporučuje vracet chyby v poli errors místo toho, aby se to cpalo do dat. Můžeš mít třeba vlastní typy chyb, jako UserNotFoundError, ValidationError apod. To pak pomůže klientům s identifikací, co se pokazilo.

Co se týče logování, je dobrý mít nějaký middleware, co chyby zaloguje na serveru. Můžeš použít třeba Winston nebo něco podobného. V logu bys měl mít alespoň čas, URL dotazu a konkrétní chybovou zprávu.

K informacím pro klienta – když dojde k chybě, tak můžeš vrátit i nějaký uživatelsky přívětivý message, aby věděli, co se stalo. Pro příklad, když máš problém s autentizací, tak klient dostane error jako "Unauthorized" a pak detailnější info v extensions, kde bys mohl mít např. code: 'UNAUTHORIZED'.

Tady je jednoduchý příklad chyby:

throw new ApolloError('User not found', 'USER_NOT_FOUND');

Takže drž se té struktury a bude to snazší pro všechny.

146 slov
1.5 minut čtení
29. 9. 2023
Jarmila Kopecká

Když mluvíme o chybách v GraphQL, je fakt dobrý mít jasně danou strukturu pro odpovědi s chybama. Většinou se doporučuje vracet chyby v poli "errors", kde bys měl mít kód chyby, zprávu a případně i nějaký detail. Například, když je problém s autentizací, tak to můžeš vrátit jako error s kódem 401 a jasnou zprávou, že uživatel není přihlášený. Dobrý je taky mít různé typy chyb, aby klient věděl, jestli jde o validaci, serverovou chybu nebo něco jiného.

Logování je důležitý taky. Můžeš použít middleware pro logování chyb na serveru – to ti pomůže později najít opakující se problémy. Když dojde k chybě, je fajn vrátit klientovi co nejvíc informací bez toho, aby ses mu zbytečně rozebíral detaily, co by mohly být citlivé.

Příklad by mohl vypadat takhle:

const \{ ApolloServer \} = require('apollo-server');

const server = new ApolloServer(\{
  //... tvoje schéma a resolvery,
  formatError: (err) =\> \{
    return \{
      message: err.message,
      code: err.extensions.code,
      path: err.path,
    \};
  \},
\});

Takhle vlastně zpracováváš chyby a posíláš klientovi relevantní data. Hlavně nezapomeň testovat a upravovat strukturu podle toho, co zákazníci potřebují vidět.

198 slov
2 minut čtení
31. 10. 2024
Roman Khýr

Když jde o zpracování chyb v GraphQL, tak je dobrý mít jasně definované, co všechno se může posílat zpět klientovi. Místo toho, abys posílal nějakou obecnou chybovou zprávu, je fajn mít strukturu, která obsahuje kód chyby, zprávu a eventuálně i nějaké detaily pro ladění.

V praxi můžeš třeba použít custom error typy. Tím pádem každý typ chyby bude mít vlastní strukturu. Například "UserNotFoundError", "ValidationError" a tak dál. Když pak dojde k chybě, prostě vrátíš odpověď s odpovídajícím kódem a popisem.

Co se týče logování, snaž se zachytit všechny důležité informace o chybě (stack trace, input data atd.), aby ses mohl snadno vrátit k problému později. Můžeš použít nějaké služby jako Sentry nebo Loggly pro sledování těchto chyb.

Pokud jde o informování klienta, snaž se poskytnout dostatečně informativní zprávu. Třeba místo "Došlo k chybě" říct "Uživatel nebyl nalezen". Klient by měl mít jasnou představu o tom, co se stalo a jak to případně opravit. To pak usnadní debugging na obou stranách.

158 slov
1.6 minut čtení
22. 3. 2024
Viktor Daněk
GraphQL.cz/Články/Edge Cases v Dotazech
Implementace mechanismů pro hlášení chyb v GraphQL serverechJak vytvořit robustní systém pro zachytávání a reportování chyb v GraphQL API, aby byly okrajové scénáře správně zpracovány a uživatelé dostali inform...
1000 slov
10 minut čtení
3. 6. 2022
Marek Dvořák
Přečíst článek
Podobné otázky