Para garantir o funcionamento correto das nossas APIs e evitar problemas é super importante sempre validar a entrada dos nossos usuários. No entanto, encadear muitos ifs-elses não é uma estratégia muito eficaz. Será que não há uma forma mais interessante de fazer isso? 🤔
Validações em APIs
- Para garantir o funcionamento correto das nossas APIs, é importante sempre validar a entrada dos nossos usuários.
- É possível fazer isso de diferentes formas, como por exemplo, usando condicionais! Como no exemplo abaixo, onde queremos validar se o usuário enviou todos os dados e se eles são válidos:
app.post("/users", (req, res) => {
const { username, email, year, password } = req.body;
if(!username || !email || !year || !password) {
return res.status(422).send("Incomplete data.");
}
const regexEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if(!regexEmail.test(email)){
return res.status(422).send("Invalid e-mail.");
}
if(isNaN(parseInt(year)) || parseInt(year) <= 1900) {
return res.status(422).send("Incomplete year.");
}
if(password.length < 6) {
return res.status(422).send("Password too short.");
}
users.push(req.body);
return res.sendStatus(201);
});
- Isso funciona? Funciona!
- Mas… Quando o nosso código começa a crescer e as regras de valições se tornam mais complexas, facilmente essa solução se torna pouco eficaz. E não precisamos ir muito longe não… Por exemplo, e se eu também quisesse validar se o nome de usuário tem até 10 caracteres e se o e-mail é válido?
- O suco já começa a azedar, né? 🧃
- Então como podemos melhorar? 🤔
- Para isso, podemos usar a biblioteca Joi! Esta é uma biblioteca de validação através de esquemas (schemas) que permite fazer o trabalho acima de forma muito mais fácil e descritiva.
- Para usá-la, o primeiro passo é instalar ela:
npm i joi
- Feito isso, precisamos definir um schema. Um schema nada mais será do que a representação da estrutura do que esperamos validar com suas respectivas regras.
- Para fazer isso, já faremos uso do Joi. Veja:
import joi from "joi";
const userSchema = joi.object({
username: joi.string().min(3).max(10).required(),
email: joi.string().email().required(),
year: joi.number().integer().min(1900).max(2024).required(),
password: joi.string().pattern(new RegExp('^[a-zA-Z0-9]{3,30}