Node.js - validation

Express validation

Wanneer data wordt gepost in je server is het verstandig te controleren of de ingestuurde data wel valide is. Bijvoorbeeld: is het email adres wel echt een email adres en voldoet het wachtwoord wel aan de gestelde eisen. Natuurlijk kun je zelf code schrijven om dit soort invoer te controleren maar er is ook een module voor Express beschikbaar. Om deze module te installeren voer je het commando npm install express-validation uit. Meer informatie over deze module vind je op de Express Validation website.

Express validation - code voorbeeld

Hieronder vind je een code voorbeeld hoe je express-validation kunt gebruiken in je Express server. In het voorbeeld gaat het over het registeren van een gebruiker.

            
import express from 'express';
import bodyParser from 'body-parser';
import { validate, ValidationError, Joi } from 'express-validation';

const app = express();
const port = 3000;

//we laten Express weten dat we graag bodyParser willen gebruiken met json (we verwachten json te ontvangen in de post)
app.use(bodyParser.json());

//dit is het validatie object voor het registeren van een gebruiker
const registerValidation = {
    body: Joi.object({
        //het email veld wordt gecontroleerd op een geldig email adres en is vereist (required)
        email: Joi.string()
            .email()
            .required(),
        /*het wacthwoord veld wordt gecontroleerd met een zogeheten reguliere expressie.
        Onderstaande expressie controleert dat het wachtwoord alleen bestaat uit de karakters a-z, A-Z
        */
        password: Joi.string()
            .regex(/[a-zA-Z0-9]{3,30}/)
            .required(),
    }),
};

/*de post route naar de url '/register' met de middleware functie validate
Aan de validate functie wordt het registerValidation object meegegeven.
Ook wordt de optie abortEarly op false gezet. Dat zorgt ervoor dat de validatie doorgaat bij een validatie fout
zodat alle velden worden gecontroleerd.
*/
app.post('/register', validate(registerValidation, {}, {abortEarly: false}), (req, res) => {
    //de velden worden uit de body gelezen
    const email = req.body.email;
    const password = req.body.password;

    //vanaf hier kun je met de invoer doen wat je wil, bijvoorbeeld invoegen in een database


    //we laten de client weten dat het een succes was
    res.send( {success: true} );
});

/*deze app.use moet onderaan komen na de routes waar je validatie wil toepassen.
Als deze functie voor de routes staat dan werkt het niet.
Deze functie zorgt ervoor dat er een JSON wordt teruggegeven in het geval er een validatie fout is.
*/
app.use(function (err, req, res, next) {
    if (err instanceof ValidationError) {
        return res.status(err.statusCode).json(err)
    }

    return res.status(500).json(err)
});

//zorgen dat de server gestart wordt op de opgegeven poort
app.listen(port, () => {
    console.log(`Example app listening on port ${port}`);
});