Proteja seus aplicativos validando dados no nível de solicitação usando a biblioteca de validação Joi.
Aceitar dados não testados e não validados em um aplicativo da web pode causar vulnerabilidades de segurança e problemas imprevistos podem surgir de dados inválidos.
Os ORMs do Node.js, como Sequelize e TypeORM, permitem definir regras de validação prontas para uso no nível do aplicativo. Durante o desenvolvimento da API, os dados vêm de solicitações HTTP para endpoints específicos. Isso acontece no nível de solicitação; assim, a validação padrão oferecida pelos ORMs não se aplica a eles.
Joi é uma descrição de esquema e validador de dados para JavaScript. Aqui, você aprenderá como usar a biblioteca de validação Joi para validar dados no nível de solicitação.
Configurando o Projeto de Demonstração
Para demonstrar como joi valida os dados, você criará um aplicativo de demonstração simples que imita um aplicativo real.
Primeiro, crie uma pasta de projeto e vá para ela executando o seguinte comando:
aplicativo de demonstração mkdir && aplicativo de demonstração cd
Em seguida, inicialize o npm no diretório do seu projeto executando:
npm init -y
Em seguida, você precisará instalar algumas dependências. As dependências necessárias para este tutorial incluem o seguinte:
- Expressar: Express é uma estrutura Node.js que fornece um conjunto robusto de recursos para aplicativos da Web e móveis. O Express facilita a criação de aplicativos de back-end com Node.js.
- joi: Joi é uma biblioteca de validação de dados para Node.js.
Instale as dependências com o gerenciador de pacotes do nó executando o comando abaixo:
npm instalar express joi
A seguir, crie um index.js arquivo em seu diretório raiz e adicione o seguinte bloco de código a ele:
const expresso = exigir("expressar");
const roteador = exigir("./rotas");
const porta = 3000;const aplicativo = expresso();
app.use (express.json());
app.use (express.urlencoded({ estendido: verdadeiro }));
app.use (roteador);
app.listen (porta, () => {
console.registro("aplicativo ouvindo na porta 3000!");
});
O bloco de código acima configura um servidor Express simples. Ele configura o middleware para analisar os dados da solicitação recebida e lidar com as solicitações recebidas e inicia o servidor para ouvir as solicitações recebidas na porta 3000.
Solicitações de roteamento e tratamento
Para simplificar, você criará um middleware manipulador de solicitação que retorna um código de status, juntamente com o corpo da solicitação, como resposta a cada solicitação que tenta enviar dados para seu aplicativo.
Criar uma handler.js arquivo no diretório raiz do seu projeto e adicione o bloco de código abaixo:
const demoHandler = (req, res, próximo) => {
res.enviar({
código: 201,
dados: req.body,
});
próximo();
};
módulo.exports = demoHandler;
A seguir, crie um router.js arquivo no diretório raiz do seu projeto e adicione o bloco de código abaixo ao seu arquivo:
const expresso = exigir("expressar");
const demoHandler = exigir("./manipulador");
const roteador = expresso. Roteador();roteador.post("/inscrever-se", demoHandler);
módulo.exports = roteador;
Criando um Joi Schema
Um esquema Joi representa a estrutura esperada de um objeto de dados específico e as regras de validação.
Para criar um esquema Joi, você pode usar o Joi.object() método e encadeia várias regras de validação expostas por Joi para definir a estrutura e os requisitos de validação para seus dados.
Por exemplo:
const exemploEsquema = Joi.object({
nome: Joi.string().min(3).obrigatório(),
});
O exemplo acima descreve um esquema Joi simples com um nome propriedade. O nome propriedade tem um valor de Joi.string().min (3).required(). Isso significa que o nome value deve ser uma string, com comprimento mínimo de 3 caracteres, e é obrigatório.
Usando o Joi, você pode encadear vários métodos para adicionar mais restrições de validação a cada campo definido em seu esquema.
Aqui está um exemplo com mais campos e restrições de validação:
const userSchema = Joi.object({
e-mail: Joi.string().email().required(),senha: Joi.string().min(6).obrigatório(),
idade: Joi.number().min(18).opcional(),
empregado: Joi.boolean().optional(),
telefone: Joi.string()
.regex(/^\\d{3}-\\d{3}-\\d{4}$/)//"123-456-7890"
.obrigatório(),endereço: Joi.object({
rua: Joi.string().min(3).obrigatório(),
cidade: Joi.string().min(3).obrigatório(),
estado: Joi.string().min(3).obrigatório(),
zip: Joi.number().min(3).obrigatório(),
}).obrigatório(),hobbies: Joi.array().items (Joi.string()).required(),
}).opções({ abortar cedo: falso });
O userSchema define as seguintes restrições para cada propriedade:
- e-mail: Deve ser uma string de e-mail válida.
- senha: Deve ser uma string com no mínimo 6 caracteres.
- idade: um número opcional com um valor mínimo de 18.
- empregado: Um booleano opcional.
- telefone: Uma string necessária que corresponde ao especificado expressão regex (/^\d{3}-\d{3}-\d{4}$/).
-
endereço: um objeto que representa o endereço do usuário com as seguintes subpropriedades.
- rua: Uma string necessária com um comprimento mínimo de 3 caracteres.
- cidade: Uma string necessária com um comprimento mínimo de 3 caracteres.
- estado: Uma string necessária com um comprimento mínimo de 3 caracteres.
- fecho eclair: um número obrigatório com um valor mínimo de 3.
- hobbies: Uma matriz necessária de strings.
Além das restrições, userSchema define o abortar cedo opção para falso. Por padrão, o Joi interrompe a execução do programa assim que encontra o primeiro erro e imprime o erro no console. No entanto, definir esta opção para falso garante que Joi verifique todo o esquema e imprima todos os erros encontrados no console.
Validando dados com Joi
Criar uma validação.js arquivo e adicione o userSchema código para ele.
Igual a:
//validation.js
const Joi = exigir("joi");const userSchema = Joi.object({
//...
}).opções({ abortar cedo: falso });
módulo.exports = userSchema;
Em seguida, crie um middleware que intercepte cargas úteis de solicitação e as verifique em relação a um esquema fornecido adicionando o seguinte código abaixo do userSchema código.
const validaçãoMiddleware = (esquema) => {
retornar(req, res, próximo) => {
const { erro } = schema.validate (req.body);se (erro) {
// Tratamento do erro de validação
console.log (erro.mensagem);
res.status(400).json({ erros: detalhes do erro });
} outro {
// Os dados são válidos, prossiga para o próximo middleware
próximo();
}
};
};
Quando uma requisição é feita, o middleware invoca o validar método do esquema para validar o corpo da solicitação. Se ocorrer algum erro de validação, o middleware envia um 400 Solicitação inválida resposta com as mensagens de erro extraídas dos detalhes do erro de validação.
Por outro lado, se a validação passar sem erros, o middleware chama o próximo() função.
Por fim, exporte o validaçãoMiddleware e userSchema.
módulo.exportações = {
userSchema,
validaçãoMiddleware,
};
Testando restrições de validação
Importar validaçãoMiddleware e userSchema dentro de voce router.js arquivo e configure o middleware da seguinte forma:
const { validationMiddleware, userSchema } = exigir("./validação");
roteador.post("/inscrever-se", validaçãoMiddleware (userSchema), demoHandler);
Inicie sua aplicação executando o comando abaixo:
nóíndice.js
Em seguida, faça uma solicitação HTTP POST para host local: 3000/cadastro usando os dados de teste abaixo. Você pode conseguir isso usando cURL ou qualquer outro cliente API.
{
"e-mail": "usuário@exemplo", // Formato de email inválido
"senha": "passar", // Comprimento da senha menor que 6 caracteres
"idade": 15, // Idade abaixo de 18
"empregado": verdadeiro,
"hobbies": ["leitura", "correndo"],
"telefone": "123-456-789", // Formato de número de telefone inválido
"endereço": {
"rua": "123",
"cidade": "Cidade Exemplo",
"estado": "Estado de Exemplo",
"fecho eclair": 12345
}
}
Essa solicitação falharia e retornaria um objeto de erro, pois a carga útil contém muitos campos inválidos, como e-mail, senha, idade e telefone. Usando o objeto de erro fornecido, você pode lidar com os erros adequadamente.
Simplificando a validação de dados com Joi
Aqui você cobriu a maioria dos fundamentos da validação de dados usando Joi. No entanto, você pode cobrir técnicas e restrições mais avançadas na documentação do Joi.
O Joi simplifica a tarefa de validação de dados em JavaScript, fornecendo uma solução intuitiva que melhora significativamente a confiabilidade e a integridade dos dados armazenados em seu aplicativo.