Autorendetailseite

Die Autorendetailseite muss die Informationen über den angegebenen Author anzeigen, der über den (automatisch generierten) Wert des _id-Feldes identifiziert wird, zusammen mit einer Liste aller Book-Objekte, die mit diesem Author verbunden sind.

Controller

Öffnen Sie /controllers/authorController.js.

Fügen Sie die folgenden Zeilen am Anfang der Datei hinzu, um das Book-Modul für die Autorendetailseite mit require() einzubinden (andere Module wie "express-async-handler" sollten bereits vorhanden sein).

js
const Book = require("../models/book");

Suchen Sie die exportierte author_detail()-Controllermethode und ersetzen Sie sie durch den folgenden Code.

js
// Display detail page for a specific Author.
exports.author_detail = asyncHandler(async (req, res, next) => {
  // Get details of author and all their books (in parallel)
  const [author, allBooksByAuthor] = await Promise.all([
    Author.findById(req.params.id).exec(),
    Book.find({ author: req.params.id }, "title summary").exec(),
  ]);

  if (author === null) {
    // No results.
    const err = new Error("Author not found");
    err.status = 404;
    return next(err);
  }

  res.render("author_detail", {
    title: "Author Detail",
    author: author,
    author_books: allBooksByAuthor,
  });
});

Der Ansatz ist genau derselbe wie auf der Genre-Detailseite beschrieben. Die Routencontrollerfunktion verwendet Promise.all(), um den angegebenen Author und die zugehörigen Book-Instanzen parallel abzufragen. Wenn kein passender Autor gefunden wird, wird ein Error-Objekt an die Express-Fehlerbehandlungsmiddleware gesendet. Wenn der Autor gefunden wird, werden die abgerufenen Datenbankinformationen mit der Vorlage "author_detail" gerendert.

Ansicht

Erstellen Sie /views/author_detail.pug und kopieren Sie den folgenden Text hinein.

pug
extends layout

block content

  h1 Author: #{author.name}
  p #{author.date_of_birth} - #{author.date_of_death}

  div(style='margin-left:20px;margin-top:20px')

    h2(style='font-size: 1.5rem;') Books
    if author_books.length
      dl
        each book in author_books
          dt
            a(href=book.url) #{book.title}
          dd #{book.summary}
    else
      p This author has no books.

Alles in dieser Vorlage wurde in früheren Abschnitten demonstriert.

Wie sieht es aus?

Führen Sie die Anwendung aus und öffnen Sie Ihren Browser unter http://localhost:3000/. Wählen Sie den Link All Authors und dann einen der Autoren. Wenn alles korrekt eingerichtet ist, sollte Ihre Seite ungefähr wie der folgende Screenshot aussehen.

Author Detail Page - Express Local Library site

Hinweis: Das Erscheinungsbild der Lebensspanne-Daten des Autors ist unschön! Wir werden das im abschließenden Abschnitt dieses Artikels angehen.

Nächste Schritte