Moderne Webanwendungen kommunizieren häufig über REST HTTP Backends, um Daten zwischen dem Frontend und der Datenbank auszutauschen. Diese Anfragen an ein REST HTTP Backend können oft große Mengen an Daten als Antwort zurückgeben, die nicht immer in ihrer Gesamtheit benötigt werden. In den meisten Fällen interessiert sich der Client nur für einen bestimmten Teil der Daten – sei es aus Effizienzgründen oder weil der spezifische Anwendungsfall nur eine Teilmenge der Informationen erfordert. Wie kann man also sicherstellen, dass der Client nur die Daten erhält, die er tatsächlich benötigt, ohne dabei unnötige Datenmengen zu übertragen?
In diesem Blogartikel werden wir uns mögliche Lösungen für dieses Problem ansehen und dann ein praktisches Beispiel mit NestJS und der Library JSON-Query durchgehen, das zeigt, wie eine dynamische Filterung der Daten direkt im Backend umgesetzt werden kann.
Mögliche Lösungsansätze für das Datenfilterungsproblem
Wenn eine API große Datenmengen als Antwort liefert, aber nur ein Bruchteil der Daten wirklich benötigt wird, gibt es im Wesentlichen zwei gängige Ansätze, um das Problem zu lösen:
In der Praxis erweist sich der zweite Ansatz als besonders mächtig, da er eine API flexibler und wartungsfreundlicher macht. Sehen wir uns nun ein Beispiel an, wie dies mit dem beliebten Framework NestJS und der Library JSON-Query umgesetzt werden kann.
Beispiel für die Datenfilterung mit NestJS und JSON-Query
Technologie-Stack: NestJS und JSON-Query
NestJS ist ein beliebtes Backend-Framework für Node.js, das auf TypeScript basiert und eine starke Modularität und Flexibilität bietet. In diesem Artikel haben wir bereits über Struktur von NestJS-Projekten gesprochen. Es wird häufig für die Erstellung von REST-APIs verwendet. In Kombination mit der Library JSON-Query, die es ermöglicht, Daten aus JSON-Objekten effizient zu filtern, lässt sich ein leistungsstarker Mechanismus zur dynamischen Filterung von API-Antworten aufbauen.
Funktionsweise des Filters
Die Idee hinter dieser Implementierung ist, dass jede Anfrage an den allgemeinen Endpunkt des Backends eine Reihe von Query-Strings enthält. Diese Query-Strings spezifizieren, welche Daten der Client benötigt. In der Middleware des Backends werden die Daten, die als Antwort zurückgegeben werden sollen, mithilfe von JSON-Query gefiltert und entsprechend modifiziert. Das Ergebnis ist eine maßgeschneiderte Antwort, die nur die angeforderten Daten enthält.
Schauen wir uns den Prozess genauer an:
Mit diesen vier Schritten kann jeder Datensatz gefiltert und auf die benötigten Daten reduziert werden.
Beispiel
user: {
firstname: "John",
lastname: "Doe",
age: 25,
email: "samples@example.com",
address: {
street: "123 Main St",
city: "New York",
state: "NY",
zip: "10001"
}
},
comments: {
count: 120,
data: [
{
id: 1,
user: {
id: 1,
name: "John Doe"
},
message: "Hello World"
},
{
id: 2,
user: {
id: 2,
name: "Jane Doe"
},
message: "Hello World"
}
]
}
}
Als anschauliches Beispiel dient dieser Datensatz. Er beinhaltet sowohl den User als auch dessen Kommentare. Gehen wir nun davon aus, dass das Frontend nur den firstname, lastname, street und den count haben möchte, kann mit diesen Filtern:
['user.firstname', 'user.lastname', 'user.address.street', 'comments.count']
folgender Datensatz erzeugt werden:
{
"firstname": "John",
"lastname": "Doe",
"street": "123 Main St",
"count": 120
}
Wie wir sehen, wurde die Antwort erheblich reduziert und enthält nur die Felder, die für den aktuellen Anwendungsfall relevant sind.
Bei der Implementierung dieser Lösung sollten einige Punkte beachtet werden:
Der Einsatz eines allgemeinen Endpunkts, der dynamische Filter unterstützt, ist eine elegante und flexible Lösung für das Problem der Datenfilterung in REST HTTP Backends. Durch die Kombination von NestJS und JSON-Query können Entwickler eine maßgeschneiderte und effiziente API erstellen, die nur die relevanten Daten an den Client sendet und somit die Effizienz der Anwendung steigert.