<Bolzplatzarena />

Komplexe Api-Zugriffe in Strapi

Komplexe Api-Zugriffe in Strapi

Nachdem ich mein letztes Projekt direkt mit Strapi 5 gestartet habe, steht jetzt eine neue Herausforderung an: Die Migration einer meiner bestehenden Webseiten von Strapi 4 auf Strapi 5. Und das ist gar nicht so einfach. Viele Plugin-Entwickler scheuen den Aufwand einer Anpassung, weshalb ich mich bereits von einigen Features verabschieden musste.

Mein eigenes Plugin – ein weiteres Problem

Auch mein eigenes Plugin funktioniert nicht mehr und muss umgebaut werden. Aber darum soll es in diesem Artikel gar nicht gehen.

Die Middleware-Herausforderung

In meiner Strapi-Instanz hatte ich eine Middleware im Einsatz, die sich um das Thema “Populate” kümmern sollte. Sie war Teil eines offiziellen Strapi-Templates, das ich für meine Zwecke angepasst und erweitert habe. Genau diese Erweiterung bereitet mir jetzt Kopfschmerzen.

Ich nutze Strapi für eine Webseite, auf der ich beliebige Inhaltsblöcke flexibel auf verschiedenen Seiten platzieren kann. Damit nicht jede Seite ihre Daten separat laden muss, erfolgt die Datenanforderung direkt zentral. Ich habe dabei konfiguriert, welche Felder für welche Module benötigt werden. Leider funktioniert das in Strapi 5 nicht mehr so flexibel und führt stattdessen zu folgender Fehlermeldung:

Invalid nested population query detected.
When using 'populate' within polymorphic structures, its value must be '*' to indicate all second level links. Specific field targeting is not supported here. Consider using the fragment API for more granular population control.

Lösung: JSON durch Array ersetzen

Es hat eine Weile gedauert, den richtigen Query zu finden – auch, weil ich ziemlich defensiv programmiert habe. Doch am Ende führte eine relativ einfache Änderung zum Erfolg: Ich habe die JSON-Schreibweise durch die Array-Schreibweise ersetzt.

const populate = [
"seo",
"contentSections",
"contentSections.picture",
"contentSections.buttons",
"contentSections.feature",
"contentSections.testimonials",
"contentSections.plans",
"contentSections.submitButton",
"contentSections.locations",
"contentSections.locations.mainImage"];