Ověření schématu pomocí Zod a Express.js

Co je Zod?

Zod je první deklarační a validační knihovna schématu TypeScript, kterou vytvořil Colin McDonnell. Na rozdíl od Yup je Zod na prvním místě TypeScript, což znamená, že má mnoho funkcí pro vývojáře TypeScript.

Zod přichází s některými opravdu skvělými funkcemi, jako je:

  • Funguje v Node.js a prohlížečích (včetně IE 11)
  • Nulové závislosti
  • Funguje také s JavaScriptem

Proč potřebujete ověřovat svá volání API?

Ověření vašich volání API vám pomůže získat správná data, která chcete, například chcete, aby vaši uživatelé měli silné heslo (např. alespoň 6 znaků), můžete použít něco jako Zod nebo Yup a zabránit uživatelům v zadávání krátkého hesla ( méně než 6 znaků). Provádění validace na serveru také dělá váš server mnohem bezpečnějším, protože nikdo nemůže otevřít vývojářské nástroje, projít váš kód a přijít na to, jak překonat vaši validaci.

Začněme kódovat

Nejprve vytvořte prázdný adresář a přejděte do něj:

mkdir schema-validation-with-zod-and-expressjs
cd schema-validation-with-zod-and-expressjs

Poté inicializujte projekt Node.js a přidejte potřebné závislosti:

npm init -y
npm install express zod

Dále přidejte následující skript do našeho package.json soubor.

{
  // ...
  "scripts": {
    "dev": "node index.js"
  }
  // ...
}

Nyní spustíme server Express.js.
Vytvořte soubor s názvem index.js v kořenu projektu:

const express = require("express");

const app = express();

app.use(express.json());

app.listen(1337, () => console.log(`> Ready on http://localhost:${1337}`));

Poté spusťte server Express.js (Můžete k němu přistupovat na http://localhost:1337 ).

npm run dev

Dále můžeme začít pracovat se Zodem,
Nejprve importujeme z od zod a přidejte jednoduché přihlašovací schéma.

const express = require("express");
const { z } = require("zod");

const app = express();

app.use(express.json());

const LoginSchema = z.object({
  // In this example we will only validate the request body.
  body: z.object({
    // email should be valid and non-empty
    email: z.string().email(),
    // password should be atleast 6 characters
    password: z.string().min(6),
  }),
});

// ...

Nyní vytvoříme náš middleware pro ověření Zod.

// ...

const validate = (schema) => (req, res, next) => {
  try {
    schema.parse({
      body: req.body,
      query: req.query,
      params: req.params,
    });

    next();
  } catch (err) {
    return res.status(400).send(err.errors);
  }
};

// ...

Nakonec vytvoříme trasu (/login ) pro POST žádosti,
který použijeme náš middleware (validate ) k provedení ověření těla žádosti.

// ...

// pass LoginSchema to validate middleware
app.post("/login", validate(LoginSchema), (req, res) => {
  return res.json({ ...req.body });
});

// ...

Konečný kód by byl následující:

const express = require("express");
const { z } = require("zod");

const app = express();

app.use(express.json());

const LoginSchema = z.object({
  // In this example we will only validate the request body.
  body: z.object({
    // email should be valid and non-empty
    email: z.string().email(),
    // password should be atleast 6 characters
    password: z.string().min(6),
  }),
});

const validate = (schema) => (req, res, next) => {
  try {
    schema.parse({
      body: req.body,
      query: req.query,
      params: req.params,
    });

    next();
  } catch (err) {
    return res.status(400).send(err.errors);
  }
};

app.post("/login", validate(LoginSchema), (req, res) => {
  return res.json({ ...req.body });
});

app.listen(1337, () => console.log(`> Ready on http://localhost:${1337}`));

Závěr

V této příručce jsme se naučili, jak ověřit naše volání Express.js REST API pomocí Zod. Kód najdete na GitHubu.

Pokud máte nějaké dotazy, kontaktujte mě.