Nikdy nevíš, kdy to přijde
Zobrazit menu   MENU

7. Validace dat

V našem API máme vytvořené všechny endpointy které jsme chtěli. Ještě je však potřeba ho dotáhnout do lepší podoby. Konkrétně doplnit validaci zasílaných dat. Zatím jsme si data zasílali sami a tím pádem jsme věděli že data jsou v pořádku. V běžném provozu tomu tak není, navíc vždy je možnost, že se nám nějaký útočník pokusí data podstrčit. Z tohoto důvodu bychom měli vždy všechna zaslaná data kontrolovat.

My si naše API rozšíříme o kontrolu typu zasílaných dat (Content-Type) na náš server a také o validaci samotných dat, aby odpovídali tomu, jak jsme si objekty nadefinovali. Kontrolu budeme přidávat pouze k metodám POST/PUT tedy k vytváření a editaci dat. Ve zbylých endpointech nám žádná data zasílána nejsou.


Kontrola typu zasílaných dat

Ke kontrole použijeme metodu is() objektu request. Ta testuje hodnotu Content-Type, která je zasílána v hlavičce požadavku. V našem programu předpokládáme, že zasílaná data budou typu JSON, přidáme tedy hned na začátek POST i PUT tuto podmínku:

if (!request.is('json')) {
response.status(415).send('Chybny pozadavek');
return;
}


Pokud je Content-Type jiné typu, vracíme klientovi stav 415 - Unsupported Media Type.


Validace vstupních dat - modul Joi

Pro validaci vstupních údajů využijeme balíček Joi. V našem případě je to možná přehnaně zbytečné, nebudeme totiž provádět žádné rozsáhlé kontroly. Je ale dobré si práci s Joi vyzkoušet. Joi umožňuje i různé složitější kontroly, například pomocí regulární výrazů. Princip je takový, že vytvoříme schéma objektu, který budeme chtít kontrolovat. Každému jednotlivému atributu nastavíme jaké má splňovat vlastnosti, nebo například zda-li je povinný. Takto vytvořené schéma pak porovnáme se zaslanými daty. Joi nám poví, zda-li je všechno v pořádku. Pokud není, dostaneme poměrně přesný výpis konkrétních chyb. Nejdříve si však musíme pomocí npm Joi nainstalovat:

npm install joi


A také přidat do našeho programu. Na začátek uvedeme:

var Joi = require('joi');


Nyní si vytvoříme schéma, vůči kterému budeme získaná data porovnávat. Všem třem atributům, které naše knihy obsahují, nastavíme že jsou povinné (required()). Pro jméno knihy a autora nastavíme minimální délku 2 znaky, pro ISBN stanovíme rozsah 10 až 18 znaků.

Obecně jde o funkci, které předáme jako parametr porovnávaný objekt. Pomocí metody Joi.validate() pak porovnáme námi stanovené schéma a tento objekt. Metoda nám vrátí objekt s několika atributy. V atributu error nalezneme konkrétní výpisy chyb. Pokud je atribute null, data žádné chyby neobsahují. V takovém případě naše funkce vrací 1, pokud se vyskytne nějaká chyba, tak 0.

function is_book_valid(book) {
var book_schema = {
name: Joi.string().min(2).required(),
author: Joi.string().min(2).required(),
isbn: Joi.string().min(10).max(18).required()
};

var is_error = Joi.validate(book, book_schema);
if (is_error.error) {
return 0;
}
return 1;
}


Dále musíme upravit obsluhu PUT a POST volání. Přidáme podmínku v tomto tvaru:

if (!is_book_valid(request.body)) {
response.status(400).send('Chybna data v pozadavku');
return;
}


V případě nevalidních dat tedy vrátíme kód 400 (Bad Request) a příslušnou zprávu. Celý finální kód POST obsluhy pak vypadá takto:

app.post('/api/books', (request, response) => {
var new_book_id = books.slice(-1)[0].book_id + 1;

if (!request.is('json')) {
response.status(415).send('Chybny pozadavek');
return;
}

if (!is_book_valid(request.body)) {
response.status(400).send('Chybna data v pozadavku');
return;
}

var book = {
book_id: new_book_id,
name: request.body.name,
author: request.body.author,
isbn: request.body.isbn
};

books.push(book);
response.send(book);
});



Zapracovat nový kód do PUT metody pro úprav dat již zvládnete zcela jistě sami. A tím jsme dokončili část tutoriálu věnovanou vytvoření našeho vlastního API. V dalších článcích se podíváme na spolupráci se skutečnou databází, konkrétně MongoDB.


Další díly tutoriálu

5. REST API: Založení projektu a první endpoint
6. REST API: Vytvoření endpointů POST, PUT a DELETE
7. Validace dat
9. Instalace MongoDB a Compass