Asegure sus aplicaciones mediante la validación de datos en el nivel de solicitud utilizando la biblioteca de validación de Joi.

Aceptar datos no probados y no validados en una aplicación web puede causar vulnerabilidades de seguridad y pueden surgir problemas imprevistos a partir de datos no válidos.

Los ORM de Node.js, como Sequelize y TypeORM, le permiten establecer reglas de validación listas para usar en el nivel de la aplicación. Durante el desarrollo de la API, los datos provienen de solicitudes HTTP a puntos finales específicos. Esto sucede en el nivel de solicitud; por lo tanto, la validación por defecto que ofrecen los ORM no les aplica.

Joi es una descripción de esquema y un validador de datos para JavaScript. Aquí, aprenderá a usar la biblioteca de validación de Joi para validar datos en el nivel de solicitud.

Configuración del proyecto de demostración

para demostrar cómo Joi valida los datos, creará una aplicación de demostración simple que imite una aplicación real.

Primero, cree una carpeta de proyecto y muévase a ella ejecutando el siguiente comando:

instagram viewer
mkdir aplicación de demostración && cd aplicación de demostración

A continuación, inicialice npm en el directorio de su proyecto ejecutando:

npm inicializar -y

A continuación, deberá instalar algunas dependencias. Las dependencias requeridas para este tutorial incluyen lo siguiente:

  • Expresar: Express es un marco Node.js que proporciona un conjunto sólido de funciones para aplicaciones web y móviles. Express facilita la creación de aplicaciones de back-end con Node.js.
  • Joi: Joi es una biblioteca de validación de datos para Node.js.

Instala las dependencias con el administrador de paquetes del nodo ejecutando el siguiente comando:

npm instalar express joi

A continuación, cree un índice.js archivo en su directorio raíz y agregue el siguiente bloque de código:

constante expresar = requerir("expresar");
constante enrutador = requerir("./rutas");
constante puerto = 3000;

constante aplicación = expreso();

aplicación.uso (express.json());
app.use (express.urlencoded({ extendido: verdadero }));
aplicación.uso (enrutador);

app.listen (puerto, () => {
consola.registro("¡aplicación escuchando en el puerto 3000!");
});

El bloque de código anterior configura un servidor Express simple. Configura el middleware para analizar los datos de las solicitudes entrantes y manejar las solicitudes entrantes e inicia el servidor para escuchar las solicitudes entrantes en el puerto 3000.

Solicitudes de enrutamiento y manejo

Para simplificar, creará un middleware de controlador de solicitudes que devuelva un código de estado, junto con el cuerpo de la solicitud, como respuesta a cada solicitud que intente enviar datos a su aplicación.

Crear un manejador.js archivo en el directorio raíz de su proyecto y agregue el bloque de código a continuación:

constante controlador de demostración = (req, res, siguiente) => {
res.enviar({
código: 201,
datos: cuerpo requerido,
});
próximo();
};

módulo.exportaciones = demoHandler;

A continuación, cree un enrutador.js archivo en el directorio raíz de su proyecto y agregue el siguiente bloque de código a su archivo:

constante expresar = requerir("expresar");
constante controlador de demostración = requerir("./manipulador");
constante enrutador = expreso. enrutador();

enrutador.post("/inscribirse", controlador de demostración);

módulo.exportaciones = enrutador;

Crear un esquema Joi

Un esquema Joi representa la estructura esperada y las reglas de validación de un objeto de datos específico.

Para crear un esquema Joi, puede usar el Joi.objeto() y encadene varias reglas de validación expuestas por Joi para definir la estructura y los requisitos de validación de sus datos.

Por ejemplo:

constante ejemploEsquema = Joi.objeto({
nombre: Joi.string().min(3).requerido(),
});

El ejemplo anterior describe un esquema Joi simple con un nombre propiedad. El nombre propiedad tiene un valor de Joi.cadena().min (3).requerido(). Esto significa que el nombre El valor debe ser una cadena, con una longitud mínima de 3 caracteres, y es obligatorio.

Usando Joi, puede encadenar varios métodos para agregar más restricciones de validación a cada campo definido en su esquema.

Aquí hay un ejemplo con más campos y restricciones de validación:

constante userSchema = Joi.objeto({
correo electrónico: Joi.string().email().required(),

contraseña: Joi.string().min(6).requerido(),

edad: Joi.number().min(18).opcional(),

empleado: Joi.boolean().opcional(),

teléfono: Joi.string()
.regex(/^\\d{3}-\\d{3}-\\d{4}$/)//"123-456-7890"
.requerido(),

dirección: Joi.objeto({
calle: Joi.cadena().min(3).requerido(),
ciudad: Joi.string().min(3).requerido(),
estado: Joi.string().min(3).requerido(),
zip: Joi.number().min(3).requerido(),
}).requerido(),

 pasatiempos: Joi.array().items (Joi.string()).required(),

}).opciones({ abortar temprano: FALSO });

El esquema de usuario define las siguientes restricciones para cada propiedad:

  • correo electrónico: Debe ser una cadena de correo electrónico válida.
  • contraseña: Debe ser una cadena con un mínimo de 6 caracteres.
  • edad: Un número opcional con un valor mínimo de 18.
  • empleado: un valor booleano opcional.
  • teléfono: Una cadena requerida que coincide con la especificada expresión regular (/^\d{3}-\d{3}-\d{4}$/).
  • DIRECCIÓN: un objeto que representa la dirección del usuario con las siguientes subpropiedades.
    • calle: Una cadena requerida con una longitud mínima de 3 caracteres.
    • ciudad: Una cadena requerida con una longitud mínima de 3 caracteres.
    • estado: Una cadena requerida con una longitud mínima de 3 caracteres.
    • cremallera: Un número requerido con un valor mínimo de 3.
  • aficiones: Una matriz requerida de cadenas.

Además de las restricciones, esquema de usuario establece el abortar temprano opción a FALSO. De manera predeterminada, Joi detiene la ejecución del programa tan pronto como encuentra el primer error e imprime el error en la consola. Sin embargo, al establecer esta opción en FALSO se asegura de que Joi verifique todo el esquema e imprima todos los errores encontrados en la consola.

Validación de datos con Joi

Crear un validación.js archivar y agregar el esquema de usuario código para ello.

Al igual que:

//validation.js
constante Joi = requerir("joi");

constante userSchema = Joi.objeto({
//...
}).opciones({ abortar temprano: FALSO });

módulo.exportaciones = esquema de usuario;

Luego, cree un middleware que intercepte las cargas útiles de las solicitudes y las verifique con un esquema provisto agregando el siguiente código debajo del esquema de usuario código.

constante validaciónMiddleware = (esquema) => {
devolver(req, res, siguiente) => {
constante { error } = esquema.validar (req.cuerpo);

si (error) {
// Manejar el error de validación
consola.log (error.mensaje);

res.status(400).json({ errores: error de detalles });
} demás {
// Los datos son válidos, continúe con el siguiente middleware
próximo();
}
};
};

Cuando se realiza una solicitud, el middleware invoca el validar metodo de la esquema para validar el cuerpo de la solicitud. Si se produce algún error de validación, el middleware envía un 400 Petición Incorrecta respuesta con los mensajes de error extraídos de los detalles del error de validación.

Por otro lado, si la validación pasa sin errores, el middleware llama al próximo() función.

Finalmente, exporte el validaciónMiddleware y esquema de usuario.

módulo.exportaciones = {
esquema de usuario,
validación de middleware,
};

Probar restricciones de validación

Importar validaciónMiddleware y esquema de usuario en tu enrutador.js archivo y configure el middleware de la siguiente manera:

constante {validaciónMiddleware, esquema de usuario} = requerir("./validación");

enrutador.post("/inscribirse", ValidationMiddleware (userSchema), demoHandler);

Inicie su aplicación ejecutando el siguiente comando:

nodoíndice.js

Luego, haz una solicitud HTTP POST para servidor local: 3000/registro utilizando los datos de prueba a continuación. Puede lograr esto usando cURL o cualquier otro cliente API.

{
"correo electrónico": "usuario@ejemplo", // Formato de correo inválido
"contraseña": "aprobar", // longitud de la contraseña de menos de 6 caracteres
"edad": 15, // Edad menor de 18
"empleado": verdadero,
"aficiones": ["lectura", "correr"],
"teléfono": "123-456-789", // Formato de número de teléfono no válido
"DIRECCIÓN": {
"calle": "123",
"ciudad": "Ciudad Ejemplo",
"estado": "Estado de ejemplo",
"cremallera": 12345
}
}

Esta solicitud fallaría y devolvería un objeto de error ya que la carga útil contiene muchos campos no válidos, como correo electrónico, contraseña, edad y teléfono. Utilizando el objeto de error proporcionado, puede manejar los errores adecuadamente.

Simplificando la validación de datos con Joi

Aquí cubriste la mayoría de los conceptos básicos de la validación de datos usando Joi. Sin embargo, puede cubrir técnicas y restricciones más avanzadas en la documentación de Joi.

Joi simplifica la tarea de validación de datos en JavaScript, brindando una solución intuitiva que mejora significativamente la confiabilidad e integridad de los datos almacenados en su aplicación.