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:

instagram viewer
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:

í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.