Validation
Damit APIs robust sind, müssen eingehende Daten validiert werden. Ohne Validation könnten ungültige Requests (falsches Format, fehlende Felder, inkonsistente Werte) die Anwendung fehlerhaft machen oder sogar Sicherheitslücken öffnen.
Beispiel
Im Beispiel wird Telemetrie-Datenvalidierung umgesetzt. Jede Funktion prüft die Struktur und Werte eines Objekts und gibt bei Fehlern ein violations-Objekt zurück.
export const validateTelemetryData = (data) => {
const violations = {};
if (!data.spacecraftId) {
violations.spacecraftId = { message: 'Attribute is required' };
}
if (!data.timestamp) {
violations.timestamp = { message: 'Attribute is required' };
} else if (!isIsoDate(data.timestamp)) {
violations.timestamp = { message: 'Attribute must be in ISO 8601 format' };
}
if (!data.metrics) {
violations.metrics = { message: 'Attribute is required' };
} else if (typeof data.metrics !== 'object') {
violations.metrics = { message: 'Attribute must be an object' };
}
if (!data.events) {
violations.events = { message: 'Attribute is required' };
} else if (!Array.isArray(data.events)) {
violations.events = { message: 'Attribute must be an array' };
} else {
data.events.forEach((event, i) => {
if (!event.timestamp) {
violations[`events[${i}].timestamp`] = { message: 'Attribute is required' };
} else if (!isIsoDate(event.timestamp)) {
violations[`events[${i}].timestamp`] = { message: 'Attribute must be in ISO 8601 format' };
}
if (!event.type) {
violations[`events[${i}].type`] = { message: 'Attribute is required' };
}
});
}
return Object.keys(violations).length > 0 ? violations : null;
};
const isIsoDate = (str) => {
if (!/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z/.test(str)) return false;
const d = new Date(str);
return !Number.isNaN(d.getTime()) && d.toISOString() === str;
};
Nun können wir diese Funktion im Route Handler aufrufen:
app.post("/telemetry", (req, res) => {
const violations = validateTelemetryData(req.body);
if (violations) {
return res.status(400).json({
error: "Request is not valid.",
invalid: true,
violations,
});
}
res.status(200).json({ success: true });
});Last updated