2
votes

Comment implémenter la validation dans un fichier séparé en utilisant express-validator

J'essaie d'utiliser express-validator pour valider le req.body avant d'envoyer une demande de publication pour insérer des données dans postgres.

J'ai un fichier de route, un fichier de contrôleur et je souhaite effectuer la validation dans un fichier appelé validate .js. En attendant, j'ai installé express-validator et dans mon server.js je l'ai importé. D'autres ressources que je rencontre semblent implémenter la validation dans la fonction qui contient la logique d'insertion des données.

//validator.js
import { check } from 'express-validator/check';

module.exports = [check('email').isEmail()];
//controller.js
createUser(req, res){
  // ...
  const { firstName, lastName, email, password } = req.body;
  //code to insert user details to the database
}

//route.js
import express from 'express';
import usersController from './controller';

const router = express.Router();

router.post('/createuser', usersController.createUser);

//server.js
....
import expressValidator from 'express-validator';

...
app.use(bodyParser.urlencoded({ extended: false }));
app.use(expressValidator);

J'espère implémenter la validation dans un fichier appelé validator.js pour, par exemple, valider l'e-mail avant de l'insérer dans la base de données


1 commentaires

Quelle est la valeur de l'attribut action de votre formulaire?


3 Réponses :


6
votes

Voici comment j'utilise express-validator. J'ai un fichier validator.js dans lequel j'ai une logique de validation pour de nombreuses routes. Par exemple:

validator.js

const { validationResult } = require('express-validator/check');


exports.createUser(req, res) {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        return res.status(422).json({ errors: errors.array() });
    }
    // do stuff here.

}

Maintenant, dans votre fichier d'itinéraire, vous avez besoin du fichier validator.js
const validator = require ("./ validator") ; // ou où se trouve votre fichier
et utilisez la logique de validation souhaitée comme middleware. Par exemple:

route.js

//

router.post('/createuser', validator.createUser, usersController.createUser);

Enfin, à l'intérieur de votre contrôleur, vous devez vérifier d'éventuelles erreurs créées lors de la validation, après avoir demandé validationResult code >.

controller.js

const { check } = require('express-validator/check');

exports.createUser = [check('email').isEmail()];

exports.anotherRoute = [// check data];

exports.doSomethingElse = [// check data];

De plus, vous n'avez pas besoin d'utiliser app.use (expressValidator); dans votre fichier server.js


4 commentaires

Merci @dimitris J'ai essayé la solution que vous avez donnée, et je ne reçois rien inséré dans la base de données et je n'obtiens aucune erreur, la demande prend une éternité.


Non, je n'ai pas modifié le contrôleur ni vérifié les erreurs


Fonctionne très bien! Merci


bonjour je suis nouveau sur node puis-je demander pourquoi vous avez utilisé les crochets au lieu de la fonction de rappel



19
votes

J'ai la même approche, sauf une chose que nous ne devrions pas gérer les erreurs de validation dans notre contrôleur. Donc, si une erreur se produit au niveau de la couche de validation, elle ne doit être renvoyée qu'à partir de là. Nous ne devons pas permettre à notre flux de contrôle d'entrer dans la couche contrôleur. Voici donc l'exemple de code:

useRoute.js

/**
 * @desc    - create new User
 * @method  - POST
 */
exports.createCategory = async (req, res) => {
  //  do your stuff here. (No need to check any validation error here)
}

userValidator.js

XXX

controller.js

const {check, validationResult} = require('express-validator');

exports.validateUser = [
  check('name')
    .trim()
    .escape()
    .not()
    .isEmpty()
    .withMessage('User name can not be empty!')
    .bail()
    .isLength({min: 3})
    .withMessage('Minimum 3 characters required!')
    .bail(),
  check('email')
    .trim()
    .normalizeEmail()
    .not()
    .isEmpty()
    .withMessage('Invalid email address!')
    .bail(),
  (req, res, next) => {
    const errors = validationResult(req);
    if (!errors.isEmpty())
      return res.status(422).json({errors: errors.array()});
    next();
  },
];


0 commentaires

2
votes

Je rencontrais quelques problèmes avec les fonctions asynchrones, voici mon humble solution j'espère que cela aidera quelqu'un:

Définitions d'itinéraire

const { check, validationResult } = require('express-validator');

const generateValidators = () => [
    check('first_name')...,
    
    check('last_name')...,
    
    check('email')...,
    
    check('password')...
]

const reporter = (req, res, next) => {
    const errors = validationResult(req);

    if (!errors.isEmpty()) {
        const errorMessages = errors.array().map(error => error.msg);
        
        return res.status(400).json({
            errors: errorMessages
        });
    }
    
    next();
}

module.exports = {
    add: [
        generateValidators(),
        reporter
    ]
};

Validateur

XXX


0 commentaires