Datenvalidierung in Node.js mit Joi
In modernen Webanwendungen mit Node.js ist die Datenvalidierung ein kritischer Schritt bei der Verarbeitung von Anfragen. Fehler in den Daten können zu Sicherheitslücken, Fehlfunktionen oder Serverabstürzen führen. Eine der leistungsstärksten und beliebtesten Bibliotheken für diese Aufgabe ist Joi (ausgesprochen wie „dschoi“). Sie ermöglicht es, Datenschemata zu beschreiben und deren Übereinstimmung mit festgelegten Regeln zu überprüfen.
Was ist Joi?
Joi ist eine Bibliothek zur Beschreibung von Schemata und zur Validierung von JavaScript-Objekten. Sie ist besonders beliebt im Node.js-Ökosystem, wo sie häufig zusammen mit Express, Hapi oder Fastify verwendet wird. Joi bietet eine einfache und ausdrucksstarke API zur Festlegung von Typen, Pflichtfeldern, Bereichen, regulären Ausdrücken und benutzerdefinierten Prüfungen.
Installation
Installation von Joi über npm:
npm install joiBasisbeispiel
Erstellen wir ein Schema zur Überprüfung von Benutzerdaten:
const Joi = require('joi');
const schema = Joi.object({ username: Joi.string() .alphanum() .min(3) .max(30) .required(), password: Joi.string() .pattern(new RegExp('^[a-zA-Z0-9]{3,30}$')), email: Joi.string() .email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } })});
const data = { username: 'user123', password: 'pass123', email: 'user@example.com'};
const { error, value } = schema.validate(data);
if (error) { console.log('Validierungsfehler:', error.details);} else { console.log('Daten sind korrekt:', value);}Wichtige Methoden und Regeln
Joi unterstützt viele Typen und Modifikatoren:
- Datentypen:
Joi.string(),Joi.number(),Joi.boolean(),Joi.date(),Joi.array(),Joi.object(). - Pflichtfelder:
.required()— das Feld ist erforderlich. - Einschränkungen:
.min(),.max(),.length()— für Zeichenketten und Arrays. - Reguläre Ausdrücke:
.pattern(regex)— Prüfung nach einem Muster. - E-Mail und URL:
.email(),.uri()— integrierte Validatoren. - Benutzerdefinierte Nachrichten:
.messages()— Ersetzung von Standardfehlern.
Validierung von verschachtelten Objekten und Arrays
Joi kommt gut mit komplexen Strukturen zurecht:
const addressSchema = Joi.object({ street: Joi.string().required(), city: Joi.string().required(), zip: Joi.string().pattern(/^\\d{5}$/)});
const userSchema = Joi.object({ name: Joi.string().required(), age: Joi.number().integer().min(18).max(120), addresses: Joi.array().items(addressSchema).min(1)});
const userData = { name: 'Anna', age: 25, addresses: [ { street: 'Newski-Prospekt', city: 'SPb', zip: '191011' } ]};
const result = userSchema.validate(userData);console.log(result.error ? result.error.details : 'OK');Fehlerbehandlung
Bei einem Validierungsfehler gibt Joi ein Objekt error.details zurück — ein Array mit detaillierter Beschreibung jedes Fehlers:
if (result.error) { result.error.details.forEach(detail => { console.log(`Feld: ${detail.path.join('.')}, Nachricht: ${detail.message}`); });}Verwendung mit Express
Joi wird häufig in Middleware zur Überprüfung von Anfragen verwendet:
const express = require('express');const Joi = require('joi');const app = express();
app.use(express.json());
const validateUser = (req, res, next) => { const schema = Joi.object({ name: Joi.string().required(), email: Joi.string().email().required() }); const { e