Autorliste-Seite und Genre-Liste-Seiten-Herausforderung
Die Autorliste-Seite muss eine Liste aller Autoren in der Datenbank anzeigen, wobei jeder Autorenname mit seiner zugehörigen Autorendetailseite verlinkt ist. Das Geburts- und Todesdatum sollte nach dem Namen in derselben Zeile angezeigt werden.
Controller
Die Controller-Funktion der Autorenliste muss eine Liste aller Author-Instanzen abrufen und diese dann zur Darstellung an das Template übergeben.
Öffnen Sie /controllers/authorController.js. Finden Sie die exportierte author_list()-Controller-Methode nahe dem Anfang der Datei und ersetzen Sie sie durch den folgenden Code.
// Display list of all Authors.
exports.author_list = async (req, res, next) => {
const allAuthors = await Author.find().sort({ family_name: 1 }).exec();
res.render("author_list", {
title: "Author List",
author_list: allAuthors,
});
};
Die Routen-Controller-Funktion folgt demselben Muster wie bei den anderen Listenseiten. Sie definiert eine Abfrage für das Author-Modell und verwendet die find()-Funktion, um alle Autoren abzurufen, sowie die sort()-Methode, um sie alphabetisch nach family_name zu sortieren. exec() wird angehängt, um die Abfrage auszuführen und ein Versprechen zurückzugeben, auf dessen Erfüllung die Funktion awaiten kann.
Sobald das Versprechen erfüllt ist, rendert der Routen-Handler das author_list(.pug)-Template und übergibt den Seitentitel (title) und die Liste der Autoren (allAuthors) unter Verwendung von Template-Schlüsseln.
Ansicht
Erstellen Sie /views/author_list.pug und ersetzen Sie dessen Inhalt durch den unten stehenden Text.
extends layout
block content
h1= title
if author_list.length
ul
each author in author_list
li
a(href=author.url) #{author.name}
| (#{author.date_of_birth} - #{author.date_of_death})
else
p There are no authors.
Führen Sie die Anwendung aus und öffnen Sie Ihren Browser unter http://localhost:3000/. Wählen Sie dann den Link Alle Autoren. Wenn alles korrekt eingerichtet ist, sollte die Seite ungefähr wie im folgenden Screenshot aussehen.

Hinweis:
Das Erscheinungsbild der Lebensdauer-Daten des Autors ist unschön! Sie können dies mit demselben Ansatz verbessern, den wir für die BookInstance-Liste verwendet haben (Hinzufügen der virtuellen Eigenschaft für die Lebensdauer zum Author-Modell).
Da der Autor jedoch möglicherweise nicht verstorben ist oder Geburts-/Todesdaten fehlen, müssen wir in diesem Fall fehlende Daten oder Verweise auf nicht vorhandene Eigenschaften ignorieren. Eine Möglichkeit, dies zu handhaben, besteht darin, entweder ein formatiertes Datum oder eine leere Zeichenkette zurückzugeben, je nachdem, ob die Eigenschaft definiert ist. Zum Beispiel:
return this.date_of_birth ? DateTime.fromJSDate(this.date_of_birth).toLocaleString(DateTime.DATE_MED) : '';
Genre-Liste-Seite—Herausforderung!
In diesem Abschnitt sollen Sie Ihre eigene Genre-Liste-Seite implementieren. Die Seite sollte eine Liste aller Genres in der Datenbank anzeigen, wobei jedes Genre mit seiner zugehörigen Detailseite verlinkt ist. Ein Screenshot des erwarteten Ergebnisses ist unten gezeigt.

Die Genre-Listen-Controller-Funktion muss eine Liste aller Genre-Instanzen abrufen und diese dann zur Darstellung an das Template übergeben.
-
Sie müssen
genre_list()in /controllers/genreController.js bearbeiten. -
Die Implementierung ist fast genau dieselbe wie die
author_list()-Controller.- Sortieren Sie die Ergebnisse aufsteigend nach Name.
-
Das zu rendernde Template sollte genre_list.pug heißen.
-
Das zu rendernde Template sollte die Variablen
title('Genre List') undgenre_list(die Liste der ausGenre.find()zurückgegebenen Genres) erhalten. -
Die Ansicht sollte dem Screenshot/den Anforderungen oben entsprechen (sie sollte eine sehr ähnliche Struktur/Format wie die Autorlistenansicht haben, außer dass Genres keine Daten haben).
Nächste Schritte
Kehren Sie zurück zu Express Tutorial Teil 5: Bibliotheksdaten anzeigen.
Fahren Sie mit dem nächsten Unterartikel von Teil 5 fort: Genre-Detailseite.