GraphQL.cz/Fórum/Jak na validaci dat v GraphQL s použitím Zod?

Jak na validaci dat v GraphQL s použitím Zod?

Zdravím všechny, chtěl bych se zeptat, jestli někdo z vás má zkušenosti s validací dat v GraphQL pomocí knihovny Zod. V poslední době jsem narazil na potřebu správně validovat vstupní data pro mé GraphQL API a Zod mi přijde jako zajímavá volba, protože má jednoduchou syntaxi a umožňuje definovat schémata. Mám ale pár otázek. Jak přesně bych měl integrovat Zod do mého GraphQL resolveru? Je nějaký konkrétní postup, jak vytvořit validační schéma a následně zpracovávat potenciální chyby? Jak se to vlastně používá v praxi? Hlavně by mě zajímalo, zda je dobré validovat data přímo v resolvers nebo spíš v middleware. A co třeba asynchronní validace? Podporuje Zod i tuhle funkci, nebo bych měl hledat alternativy? Velice rád bych slyšel vaše názory a tipy, protože chci mít jistotu, že moje API bude robustní a bezpečné. Díky moc za jakékoli rady!

139 slov
1.4 minut čtení
4. 12. 2024
Pavel Horálek
Pavel Horálek

Zod je fakt super volba pro validaci dat v GraphQL. Jak to udělat? Můžeš si vytvořit validační schéma, třeba takhle:

 import \{ z \} from 'zod';

const userSchema = z.object(\{
  name: z.string().min(1),
  email: z.string().email(),
\});

Pak to použiješ v resolvers. Můžeš validaci provádět přímo tam, kde zpracováváš requesty. Když dostaneš data, prostě je projedeš schématem:

async function createUser(parent, args) \{
  try \{
    const validatedData = userSchema.parse(args);
    // Ulož validatedData do DB nebo něco udělej.
  \} catch (error) \{
    throw new Error('Invalid data');
  \}
\}

Když dojde k chybě, tak chytneš výjimku a můžeš poslat uživateli jasnou zprávu. Zod umí i asynchronní validace, takže pokud potřebuješ ověřit něco jako existenci uživatelského jména v DB, tak to uděláš takto:

const asyncSchema = userSchema.refine(async (data) =\> \{
  const exists = await checkIfUserExists(data.email);
  return !exists;
\}, \{
  message: "Email už existuje",
\});

Co se týče middleware vs resolvers, já bych doporučil dělat to v resolvers, protože si tak můžeš lépe přizpůsobit chybové zprávy a logiku pro každý endpoint. Middleware je fajn na globální validace, ale na konkrétní případy je lepší mít vlastní logiku právě v resolveru. Takže shrnutí: Zod je super, validuj buď v resolvers nebo middleware a klidně používej i asynchronní funkce, pokud to potřebuješ.

208 slov
2.1 minut čtení
20. 12. 2024
Zdeněk Burian
Zdeněk Burian

Integrace Zod do GraphQL resolverů je celkem jednoduchá. Můžeš si vytvořit validační schéma pomocí Zod, třeba takhle: const schema = z.object(\{ name: z.string().min(1), age: z.number().min(0) \});. Pak v resolveru použiješ schema.parse(args.input) na vstupní data. Pokud jsou data špatně, Zod hodí chybu, kterou můžeš zachytit a vrátit klientovi nějaký smysluplný error message.

Co se týká místa validace, obě možnosti mají své výhody. Validace přímo v resolvers ti dává větší kontrolu nad chybami, ale pokud máš víc resolverů a stejnou logiku, může být lepší udělat middleware. Asynchronní validaci Zod podporuje taky, stačí použít schema.parseAsync(), takže pokud potřebuješ třeba ověřit unikátnost v databázi, to jde.

Dohromady bys měl mít robustní API. Hlavně nezapomeň na správné ošetření chyb a jasné zprávy pro uživatele. To zlepší zkušenost s tvým API.

124 slov
1.2 minut čtení
7. 1. 2025
Jindřiška Buchtová
Jindřiška Buchtová

Když chceš používat Zod pro validaci dat v GraphQL, tak si nejdřív vytvoř validační schéma. To se dělá jednoduše, pomocí Zod můžeš definovat různé typy jako string, number, atd. Pak v resolveru prostě zavolej schema.parse(data), kde data jsou vstupní argumenty. Pokud je všechno ok, pokračuješ, jinak chytíš error a můžeš ho nějak zpracovat (třeba vrátit uživateli).

Myslím, že validace přímo v resolveru je fajn pro jednoduché případy. Na složitější věci klidně použij middleware. Zod taky podporuje asynchronní validace, což je super, pokud potřebuješ třeba kontrolovat něco v databázi. Takže se neboj použít Zod, je to fakt užitečný nástroj pro robustnost tvého API.

102 slov
1 minut čtení
25. 1. 2025
Radka Švecová
Radka Švecová
Podobné otázky