Datenvalidierung in JavaScript (Node.js) mit Joi und Yup

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Datenvalidierung in JavaScript (Node.js): Joi und Yup



In jeder Webanwendung, insbesondere in Node.js, ist die Überprüfung eingehender Daten eine der Kernaufgaben. Ohne Validierung riskieren Sie Datenbankfehler, Sicherheitslücken (SQL-Injection, XSS) oder ein fehlerhaftes Serververhalten. In diesem Artikel betrachten wir die beiden beliebtesten Bibliotheken zur Validierung: Joi und Yup. Sie erfahren, wie Sie diese installieren, Schemata erstellen und in Express integrieren.



Warum ist serverseitige Validierung notwendig?

Clientseitige Validierung (HTML5 oder JavaScript im Browser) ist praktisch, aber leicht zu umgehen. Daher ist eine serverseitige Überprüfung zwingend erforderlich. Sie stellt sicher, dass:

  • Datentypen den Erwartungen entsprechen (String, Zahl, Array).
  • Pflichtfelder nicht leer sind.
  • Daten die zulässigen Größen nicht überschreiten.
  • Formate (E-Mail, URL, Telefon) korrekt sind.


Die Bibliothek Joi

Joi ist ein leistungsstarker Validator von den Entwicklern von Hapi.js. Er unterstützt komplexe Schemata, benutzerdefinierte Fehlermeldungen und asynchrone Prüfungen.



Installation

npm install joi


Beispielschema für die Benutzerregistrierung

const Joi = require('joi');

const userSchema = Joi.object({ username: Joi.string() .alphanum() .min(3) .max(30) .required() .messages({ 'string.min': 'Der Benutzername muss mindestens 3 Zeichen lang sein', 'string.max': 'Der Benutzername darf maximal 30 Zeichen lang sein' }), email: Joi.string() .email({ tlds: { allow: false } }) .required(), password: Joi.string() .pattern(new RegExp('^[a-zA-Z0-9]{8,30}$')) .required(), birth_year: Joi.number() .integer() .min(1900) .max(2024)});

// Validierungapp.post('/register', (req, res) => { const { error, value } = userSchema.validate(req.body, { abortEarly: false }); if (error) { return res.status(400).json({ status: 'error', message: error.details.map(d => d.message).join(', ') }); } res.json({ status: 'success', data: value });});


Erweiterte Funktionen von Joi

  • Array-Validierung: Joi.array().items(Joi.string())
  • Bedingte Regeln: .when('role', { is: 'admin', then: Joi.required() })
  • Benutzerdefinierte Funktionen: .custom((value, helpers) => { ... })


Die Bibliothek Yup

Yup ist eine leichte und intuitive Bibliothek, die im React-Ökosystem (Formik) beliebt ist. Sie funktioniert aber auch hervorragend auf dem Server.



Installation

npm install yup


Beispielschema für den Login

const yup = require('yup');

const loginSchema = yup.object().shape({ email: yup.string() .email('Geben Sie eine gültige E-Mail-Adresse ein') .required('E-Mail ist erforderlich'), password: yup.string() .min(8, 'Das Passwort muss mindestens 8 Zeichen lang sein') .max(50) .required('Passwort ist erforderlich')});

// Middleware für Expressasync function validateLogin(req, res, next) { try { const validatedData = await loginSchema.validate(req.body, { abortEarly: false }); req.validatedData = validatedData; next(); } catch (err) { res.status(400).json({ status: 'error', errors: err.errors // Array von Fehlermeldungen }); }}

app.post('/login', validateLogin, (req, res) => { res.json({ status: 'success', data: req.validatedData });});


Besonderheiten von Yup

  • Asynchrone Validierung standardmäßig (gibt ein Promise zurück).
  • Datentransformation: .transform((value) => value.tr

Empfehlungen