Je souhaite valider mes itinéraires Express avant d'appeler la logique du contrôleur. J'utilise joi et j'ai créé un validateur capable de valider l'objet Request par rapport à l'objet de schéma
import { Request, Response, NextFunction } from 'express';
import joi, { SchemaLike, ValidationError, ValidationResult } from '@hapi/joi';
import { injectable } from 'inversify';
@injectable()
export abstract class RequestValidator {
protected validateRequest = (validationSchema: SchemaLike, request: Request, response: Response, next: NextFunction): void => {
const validationResult: ValidationResult<Request> = joi.validate(request, validationSchema, {
abortEarly: false
});
const { error }: { error: ValidationError } = validationResult;
if (error) {
response.status(400).json({
message: 'The request validation failed.',
details: error.details
});
} else {
next();
}
}
}
Ensuite, j'ai créé une classe dérivée qui crée le validationSchema et appelle la méthode validateRequest
. Par souci de simplicité, je vais montrer la validation "deleteUserById"
import { Request, Response, NextFunction } from 'express';
import joi, { SchemaLike } from '@hapi/joi';
import { injectable } from 'inversify';
import { RequestValidator } from './RequestValidator';
@injectable()
export class UserRequestValidator extends RequestValidator {
public deleteUserByIdValidation = async (request: Request, response: Response, next: NextFunction): Promise<void> => {
const validationSchema: SchemaLike = joi.object().keys({
params: joi.object().keys({
id: joi.number().required(),
})
});
this.validateRequest(validationSchema, request, response, next);
}
}
Remarque importante: Je crée le SchemaLike
de cette façon car certains itinéraires peuvent avoir params, body, query
qui doit être validé en une seule fois.
Lors de l'appel de l'itinéraire
SUPPRIMER/utilisateurs/1
la validation échoue toujours. Je reçois cette erreur
UnhandledPromiseRejectionWarning: TypeError: joi_1.default.validate n'est pas une fonction
L'erreur se produit à chaque validation, qu'elle soit appelée correctement ou non. Est-ce que quelqu'un sait comment le réparer?
Frappez le même problème lors de l'utilisation de express-joi-validation
.
Si vous pouvez utiliser la version 15, rétrogradez Joi.
npm uninstall --save @hapi/joi
npm install --save @hapi/[email protected]
Vous le corrigez en changeant joi.validate(request, validationSchema
En validationSchema.validate(request
Comme joi.validate()
n'est plus pris en charge dans la version 16. Il est clairement documenté dans les documents API et les notes de version.
La mise à jour de la version de joi ne fonctionne pas avec Joi.validate(req.body,schema);
Pas besoin d'utiliser l'objet séparément. Utilisez-le comme suit. Cela a fonctionné pour moi en douceur. Faites-moi savoir si je me trompe:
const Joi = require('@hapi/joi');
const schema = Joi.object({
name:Joi.string().min(3).required(),
email:Joi.string().min(4).required().email(),
password:Joi.string().min(6).required()
});
router.post('/register', async (req,res) => {
//updated joi
// This is a shorter version
const { error } = schema.validate(req.body);
// This will send the specify error to the user
res.send(error.details[0].message);
// WORKING WITH DEPRECATED VERSION
// const Validation = Joi.validate(req.body,schema);
// res.send(Validation);
Au lieu de rétrograder la version Joi
, il est préférable de consulter rapidement l'API de la version la plus récente et de vérifier la bonne façon de l'utiliser.
Ici est le lien vers la dernière API Joi en ce moment (16.1.7), où vous pouvez voir un exemple d'utilisation de validate
.
Aussi pour vous assurer que vous savez ce qui a été changé dans la prochaine version d'une bibliothèque que vous utilisez, il est bon de jeter un œil aux notes de version, voici un lien vers une version de Joi version 16 où vous pouvez voir toutes les modifications/nouvelles fonctionnalités, et pour info, vous pouvez voir des informations sur la méthode validate
:
Supprimez Joi.validate () et Joi.describe () (appelez plutôt directement sur le schéma) (# 1941)
Voici quelques corrections avec des codes d'extrait :)
Installez ci-dessous le paquet npm.
npm install --save @hapi/[email protected]
fichier req-validator.js
const Joi = require("@hapi/joi");
const registerValidation = data => {
const schema = {
name : Joi.string().min(4).required(),
email: Joi.string().min(4).required().email(),
password: Joi.string().min(4).required()
};
return Joi.validate(data,schema);
}
module.exports.registerValidation = registerValidation;
enfin, appeler la méthode de validation dans le contrôleur.
const router = require("express").Router();
const {registerValidation} = require("./req-validator")
router.post("/register",async(req,res)=> {
const {error} = registerValidation(req.body);
if(error){
return res.status(400).send(error.details[0].message);
}
// logic to save in DB....
}