Sichern Sie Ihre Anwendungen, indem Sie Daten auf Anforderungsebene mithilfe der Joi-Validierungsbibliothek validieren.
Das Akzeptieren ungetesteter und nicht validierter Daten in eine Webanwendung kann zu Sicherheitslücken führen und durch die ungültigen Daten können unvorhergesehene Probleme entstehen.
Mit Node.js-ORMs wie Sequelize und TypeORM können Sie Validierungsregeln sofort auf Anwendungsebene festlegen. Während der API-Entwicklung stammen Daten aus HTTP-Anfragen an bestimmte Endpunkte. Dies geschieht auf der Anforderungsebene; Daher gilt die von den ORMs angebotene Standardvalidierung nicht für sie.
Joi ist eine Schemabeschreibung und Datenvalidierung für JavaScript. Hier erfahren Sie, wie Sie die Joi-Validierungsbibliothek verwenden, um Daten auf Anforderungsebene zu validieren.
Demoprojekt einrichten
Um zu demonstrieren, wie Joi Wenn Sie Daten validieren, erstellen Sie eine einfache Demoanwendung, die eine tatsächliche Anwendung nachahmt.
Erstellen Sie zunächst einen Projektordner und verschieben Sie ihn, indem Sie den folgenden Befehl ausführen:
mkdir demoapp && cd demoapp
Als nächstes initialisieren Sie npm in Ihrem Projektverzeichnis, indem Sie Folgendes ausführen:
npm init -y
Als nächstes müssen Sie einige Abhängigkeiten installieren. Zu den für dieses Tutorial erforderlichen Abhängigkeiten gehören die folgenden:
- Äußern: Express ist ein Node.js-Framework das eine Reihe robuster Funktionen für Web- und mobile Anwendungen bietet. Express erleichtert die Erstellung von Backend-Anwendungen mit Node.js.
- Joi: Joi ist eine Datenvalidierungsbibliothek für Node.js.
Installieren Sie die Abhängigkeiten mit der Knotenpaketmanager indem Sie den folgenden Befehl ausführen:
npm install express joi
Als nächstes erstellen Sie eine index.js Datei in Ihrem Stammverzeichnis und fügen Sie den folgenden Codeblock hinzu:
const ausdrücken = erfordern("äußern");
const Router = erfordern("./routen");
const Port = 3000;const app = express();
app.use (express.json());
app.use (express.urlencoded({ erweitert: WAHR }));
app.use (Router);
app.listen (port, () => {
Konsole.Protokoll(„App lauscht auf Port 3000!“);
});
Der obige Codeblock richtet einen einfachen Express-Server ein. Es konfiguriert Middleware, um eingehende Anforderungsdaten zu analysieren und eingehende Anforderungen zu verarbeiten, und startet den Server, um auf eingehende Anforderungen auf Port 3000 zu warten.
Weiterleitung und Bearbeitung von Anfragen
Der Einfachheit halber erstellen Sie eine Middleware für den Anforderungshandler, die zusammen mit dem Anforderungstext einen Statuscode als Antwort auf jede Anforderung zurückgibt, die versucht, Daten an Ihre Anwendung zu senden.
Ein... kreieren handler.js Datei im Stammverzeichnis Ihres Projekts und fügen Sie den folgenden Codeblock hinzu:
const demoHandler = (req, res, weiter) => {
res.send({
Code: 201,
Daten: req.body,
});
nächste();
};
Modul.exports = demoHandler;
Als nächstes erstellen Sie eine router.js Datei im Stammverzeichnis Ihres Projekts und fügen Sie den folgenden Codeblock zu Ihrer Datei hinzu:
const ausdrücken = erfordern("äußern");
const demoHandler = erfordern("./handler");
const Router = Express. Router();router.post("/Anmeldung", demoHandler);
Modul.exports = Router;
Erstellen eines Joi-Schemas
Ein Joi-Schema stellt die erwartete Struktur und Validierungsregeln eines bestimmten Datenobjekts dar.
Um ein Joi-Schema zu erstellen, können Sie das verwenden Joi.object() Methode und Kette verschiedener Validierungsregeln, die von Joi bereitgestellt werden, um die Struktur und Validierungsanforderungen für Ihre Daten zu definieren.
Zum Beispiel:
const exampleSchema = Joi.object({
Name: Joi.string().min(3).erforderlich(),
});
Das obige Beispiel beschreibt ein einfaches Joi-Schema mit einem Name Eigentum. Der Name Eigentum hat einen Wert von Joi.string().min (3).required(). Dies bedeutet, dass die Name Der Wert sollte eine Zeichenfolge mit einer Mindestlänge von 3 Zeichen sein und ist erforderlich.
Mit Joi können Sie verschiedene Methoden verketten, um jedem in Ihrem Schema definierten Feld weitere Validierungseinschränkungen hinzuzufügen.
Hier ist ein Beispiel mit mehr Feldern und Validierungsbeschränkungen:
const userSchema = Joi.object({
E-Mail: Joi.string().email().required(),Passwort: Joi.string().min(6).erforderlich(),
Alter: Joi.number().min(18).Optional(),
eingesetzt: Joi.boolean().optional(),
Telefon: Joi.string()
.regex(/^\\d{3}-\\d{3}-\\d{4}$/)//"123-456-7890"
.erforderlich(),Adresse: Joi.object({
Straße: Joi.string().min(3).erforderlich(),
Stadt: Joi.string().min(3).erforderlich(),
Zustand: Joi.string().min(3).erforderlich(),
zip: Joi.number().min(3).erforderlich(),
}).erforderlich(),Hobbys: Joi.array().items (Joi.string()).required(),
}).Optionen({ abortEarly: FALSCH });
Der userSchema definiert die folgenden Einschränkungen für jede Eigenschaft:
- Email: Muss eine gültige E-Mail-Zeichenfolge sein.
- Passwort: Muss eine Zeichenfolge mit mindestens 6 Zeichen sein.
- Alter: Eine optionale Zahl mit einem Mindestwert von 18.
- beschäftigt: Ein optionaler boolescher Wert.
- Telefon: Eine erforderliche Zeichenfolge, die mit der angegebenen übereinstimmt Regex-Ausdruck (/^\d{3}-\d{3}-\d{4}$/).
-
Adresse: Ein Objekt, das die Adresse des Benutzers mit den folgenden Untereigenschaften darstellt.
- Straße: Eine erforderliche Zeichenfolge mit einer Mindestlänge von 3 Zeichen.
- Stadt: Eine erforderliche Zeichenfolge mit einer Mindestlänge von 3 Zeichen.
- Zustand: Eine erforderliche Zeichenfolge mit einer Mindestlänge von 3 Zeichen.
- Reißverschluss: Eine erforderliche Zahl mit einem Mindestwert von 3.
- Hobbys: Ein erforderliches Array von Zeichenfolgen.
Zusätzlich zu den Einschränkungen userSchema legt die fest abortEarly Option zu FALSCH. Standardmäßig stoppt Joi die Ausführung des Programms, sobald der erste Fehler auftritt, und gibt den Fehler auf der Konsole aus. Allerdings wird diese Option auf eingestellt FALSCH stellt sicher, dass Joi das gesamte Schema überprüft und alle aufgetretenen Fehler an die Konsole ausgibt.
Validieren von Daten mit Joi
Ein... kreieren validation.js Datei und fügen Sie die hinzu userSchema Code dazu.
Etwa so:
//validation.js
const Joi = erfordern(„joi“);const userSchema = Joi.object({
//...
}).Optionen({ abortEarly: FALSCH });
Modul.exports = userSchema;
Erstellen Sie dann eine Middleware, die Anforderungsnutzlasten abfängt und sie anhand eines bereitgestellten Schemas überprüft, indem Sie den folgenden Code unterhalb hinzufügen userSchema Code.
const validationMiddleware = (Schema) => {
zurückkehren(req, res, weiter) => {
const { Fehler } = schema.validate (req.body);Wenn (Fehler) {
// Validierungsfehler behandeln
Konsole.log (Fehlermeldung);
res.status(400).json({ Fehler: Fehlerdetails });
} anders {
// Daten sind gültig, fahren Sie mit der nächsten Middleware fort
nächste();
}
};
};
Wenn eine Anfrage gestellt wird, ruft die Middleware die auf bestätigen Methode der Schema um den Anfragetext zu validieren. Wenn Validierungsfehler auftreten, sendet die Middleware eine 400 Ungültige Anfrage Antwort mit den aus den Validierungsfehlerdetails extrahierten Fehlermeldungen.
Wenn die Validierung hingegen fehlerfrei verläuft, ruft die Middleware die auf nächste() Funktion.
Exportieren Sie abschließend die ValidierungMiddleware Und userSchema.
Modul.exports = {
userSchema,
ValidierungMiddleware,
};
Validierungsbeschränkungen testen
Importieren ValidierungMiddleware Und userSchema in dein router.js Datei und richten Sie die Middleware wie folgt ein:
const { validationMiddleware, userSchema } = erfordern("./Validierung");
router.post("/Anmeldung", validationMiddleware (userSchema), demoHandler);
Starten Sie Ihre Anwendung, indem Sie den folgenden Befehl ausführen:
KnotenIndex.js
Stellen Sie dann eine HTTP-POST-Anfrage an localhost: 3000/Anmeldung unter Verwendung der untenstehenden Testdaten. Sie können dies mit cURL oder einem anderen API-Client erreichen.
{
"Email": „Benutzer@Beispiel“, // Ungültiges Email-Format
"Passwort": "passieren", // Passwortlänge weniger als 6 Zeichen
"Alter": 15, // Alter unter 18
"beschäftigt": WAHR,
„Hobbys“: ["Lektüre", "Betrieb"],
"Telefon": "123-456-789", // Ungültiges Telefonnummernformat
"Adresse": {
"Straße": "123",
"Stadt": „Beispielstadt“,
"Zustand": „Beispielstaat“,
"Reißverschluss": 12345
}
}
Diese Anfrage würde fehlschlagen und ein Fehlerobjekt zurückgeben, da die Nutzlast viele ungültige Felder wie E-Mail, Passwort, Alter und Telefonnummer enthält. Mit dem bereitgestellten Fehlerobjekt können Sie dies tun mit den Fehlern umgehen passend.
Vereinfachen Sie die Datenvalidierung mit Joi
Hier haben Sie die meisten Grundlagen der Datenvalidierung mit Joi behandelt. Fortgeschrittenere Techniken und Einschränkungen können Sie jedoch in der Joi-Dokumentation behandeln.
Joi vereinfacht die Datenvalidierungsaufgabe in JavaScript und bietet eine intuitive Lösung, die die Zuverlässigkeit und Integrität der in Ihrer Anwendung gespeicherten Daten erheblich verbessert.