简体   繁体   中英

Validate form-data data with express-validator

I have the problem that express-validator is not validating my data that comes from form-data when I send it empty or full data in postman it always shows me the errors that I validate in express-validator and it is not correct.

What do you think is the solution for this? Is there another method in express validator to validate form-data? Thank you very much in advance

index.js

//Importar express
const express = require('express');
//Importar cors
const cors = require('cors');
//Importar DB
const connectDB = require('./config/db');

//Crear servidor
const app = express();

//Habilitar cors
app.use(cors());

//Conectar DB
connectDB();

//Habilitar body parser
app.use(express.urlencoded({ extended: true }));

//Habilitar express.json
app.use(express.json());

//Habilitar carpeta publica
app.use(express.static('uploads'));

//Puerto de la app
const port = process.env.PORT || 4000;

app.use('/api/schools', require('./routes/schools'));

app.listen(port, '0.0.0.0', () => {
    console.log(`El servidor funciona en el puerto ${port}`)
})

Router school.js

const express = require('express');
const router = express.Router();
const {check} = require('express-validator')
const schoolController = require('../controllers/schoolController');


router.post('/',
    [
        check('name', 'El nombre es obligatorio').not().isEmpty(),
        check('email', 'Agrega un email valido').isEmail(),
    ],
    schoolController.uploadLogo,
    schoolController.newSchool
)

module.exports = router;

Controller schoolController.js

const School = require('../models/School');
const { validationResult } = require('express-validator');

exports.newSchool = async (req, res) => {
    const error = validationResult(req);
    if(!error.isEmpty()){
       return  res.status(400).json({error: error.array()})
    }

    try {
        const{email} = req.body;
        let user = await School.findOne({ email });
        if (user) {
            return res.status(400).json({msg: 'El usuario ya existe'})
        }
        user = new School(req.body);
        await user.save();
        res.json({msg: 'Escuela creada exitosamente'});
    } catch (error) {
        console.log(error);
    }
}

I implemented my controller code like this and it works:


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

    app.post('/', 
        check('name', 'El nombre es obligatorio').not().isEmpty(),
        check('email', 'Agrega un email valido').isEmail(),(req, res ) => {
      const errors = validationResult(req);
      if(!errors.isEmpty()){
        res.render( '/', {errors:errors.array(), success:false}, (err, html) => {res.send(html)})
      }
      else{
         // process request
      };
  });

Why not use a small middleware after all the checks an your route? Lets say you have a mware file like myValidation.js

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

const myValidation = async  (req, res, next)=>{
    const has_errors = validationResult( req );
    if(!has_errors.isEmpty()){
        // Show your error message here, i.e,
        return res.status(400).json(has_errors);
    }
    next();
}

module.exports = {
    myValidation
}

and you could use it as follows on your school route:

const express = require('express');
const router = express.Router();
const {check} = require('express-validator');
const { myValidation} = require ('./myValidation.js'); // mware

const schoolController = require('../controllers/schoolController');


router.post('/',
    [
        check('name', 'El nombre es obligatorio').not().isEmpty(),
        check('email', 'Agrega un email valido').isEmail(),
        myValidation
    ],
    schoolController.uploadLogo,
    schoolController.newSchool
)

module.exports = router;

Salu2

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM