Walidacja to granica aplikacji
Dane klienta sprawdzaj przed logiką zapisującą je w bazie. Schemat określa kształt danych, ale nie zastępuje autoryzacji, limitów ani kontroli reguł biznesowych. Dla pól tekstowych ustal długości, a dla liczb sensowny zakres. Nie buduj schematu z kodu przesłanego przez użytkownika.
Zdefiniuj wejście i wyjście
Poniższy kod zakłada projekt Node.js z Fastify oraz modułami ES. Dostosuj wersję Node do używanego wydania frameworka. Schemat odpowiedzi określa, które pola mają zostać zwrócone.
import Fastify from "fastify";
const app = Fastify();
app.post("/notes", {
schema: {
body: {
type: "object",
required: ["text"],
properties: {
text: { type: "string", minLength: 1, maxLength: 500 }
}
},
response: {
201: { type: "object", properties: { ok: { type: "boolean" } } }
}
}
}, async (request, reply) => {
return reply.code(201).send({ ok: true });
});Ten przykład nie zapisuje notatki. W rzeczywistej aplikacji przed zapisem sprawdź tożsamość użytkownika i prawo do operacji. Domyślne opcje walidatora mogą modyfikować wartości wejściowe; ustal, czy chcesz konwersji typów lub usuwania dodatkowych pól, i przetestuj wybraną politykę.
Sprawdź niepoprawne dane
const result = await app.inject({
method: "POST",
url: "/notes",
payload: { text: "" }
});
if (result.statusCode !== 400) throw new Error("Expected 400");
await app.close();Dodaj przypadek prawidłowy, brak pola oraz zbyt długi tekst. inject pozwala przejść przez obsługę trasy bez publicznego nasłuchu. Nie porównuj tylko identycznego tekstu komunikatu błędu; ważne są status i to, że logika zapisu nie została uruchomiona.
Nie wykonuj kosztownego I/O w schemacie
Sprawdzenie użytkownika w bazie lub wywołanie zewnętrznego API umieść w odpowiednim hooku po walidacji struktury. Osobno ogranicz wielkość body, liczbę żądań i czas operacji. Nie zwracaj klientowi surowych wyjątków, sekretów ani parametrów połączenia z bazą.
Źródła i dokumentacja
Odnośniki do źródeł pozwalają sprawdzić daty, dostępność oraz pełny kontekst informacji.