Menu
CoddyTech

Über ObjectId suchen

Teil des Abschnitts Datenbanken mit MongoDB der Node.js-Journey von Coddy. Lektion 7 von 29.

Um ein einzelnes Buch zurückzugeben, sucht der Server es anhand seiner _id, aber die ID kommt als Text in der URL an.

Eine von MongoDB erstellte _id ist eine ObjectId: ein 12 Byte langer Wert, der als 24 hexadezimale Zeichen geschrieben wird: die Ziffern 0 bis 9 und die Buchstaben a bis f. In JSON wird sie als Zeichenfolge dargestellt, in der Datenbank ist sie jedoch keine, sodass ein Filter mit dem einfachen Text nichts findet. Wandle den Text zuerst in eine ObjectId um. ObjectId.isValid gibt an, ob ein Text eine ObjectId sein kann, denn new ObjectId löst bei allen anderen Werten einen Fehler aus.

import { ObjectId } from 'mongodb';

const text = '66f1c2a9e4b0a1b2c3d4e5f6';
await orders.findOne({ _id: new ObjectId(text) }); // die Bestellung oder null
await orders.findOne({ _id: text });               // null: text ist kein ObjectId
ObjectId.isValid('42');                            // false

findOne gibt das erste passende Dokument zurück oder null, wenn keines passt.

challenge icon

Aufgabe

Einfach

Dieser Schritt öffnet das vorbereitete Bücherregal-API-Projekt des Kurses, nicht deine Projektdateien aus Dokumente einfügen (einschließlich server.js). Deine frühere Arbeit bleibt in ihrer eigenen Lektion. Lies die bereitgestellten Dateien, bevor du server.js bearbeitest. Diese Kopie enthält die Routen zum Auflisten und Einfügen von Büchern.

Ein Client möchte ein einzelnes Buch, ausgewählt anhand seiner _id.

  1. Füge in server.js eine GET /books/:id-Route hinzu.
  2. Die ID in der URL ist Text. Manche Texte können niemals eine ObjectId sein: Sie besteht aus 24 Zeichen, nämlich Ziffern und den Buchstaben a bis f. Antworte bei solchen Texten mit Status 400 und einem Fehler, indem du sendError verwendest, zum Beispiel { "error": "Not a valid id" }. Prüfe dies, bevor du eine ObjectId erstellst, denn das Erstellen einer ObjectId aus ungültigem Text löst einen Fehler aus.
  3. Suche andernfalls das Buch anhand seiner _id. Wenn du es findest, antworte mit Status 200 und dem Buch: { "_id": "6720a1f4c2b9e81d3a5f0c11", "title": "Dune", "author": "Frank Herbert", "year": 1965, "isbn": "9780441013593", "genre": "scifi" }.
  4. Wenn kein Buch diese _id hat, antworte mit Status 404 und einem Fehler, zum Beispiel { "error": "No such book" }. Probiere es aus: Sende GET /books und kopiere Dunes _id: die 24 Zeichen nach "_id":. Bei jedem Ausführen erhalten die Bücher neue IDs, also kopiere sie nach jedem Ausführen erneut. Sende GET /books/, gefolgt von der kopierten ID: Du erhältst Status 200 und Dune. Sende GET /books/42: Du erhältst Status 400. Sende GET /books/000000000000000000000000: Dies ist eine gültige ID, die kein Buch hat, also erhältst du Status 404.

Probier es selbst

import express from 'express';
import { MongoClient } from 'mongodb';

const client = new MongoClient('mongodb://localhost:27017');
const db = client.db('shelf');
const books = db.collection('books');

await books.insertMany([
    { title: 'Dune', author: 'Frank Herbert', year: 1965, isbn: '9780441013593', genre: 'scifi' },
    { title: 'Kindred', author: 'Octavia E. Butler', year: 1979, isbn: '9780807083697', genre: 'scifi' },
    { title: 'Emma', author: 'Jane Austen', year: 1815, isbn: '9780141439587', genre: 'classic' },
]);

const app = express();
app.use(express.json());

// Jeder Fehler antwortet mit { error: message }.
function sendError(res, status, message) {
    res.status(status).json({ error: message });
}

app.get('/', (req, res) => {
    res.send('Bookshelf API');
});

app.get('/books', async (req, res) => {
    const list = await books.find().toArray();
    res.json(list);
});

app.post('/books', async (req, res) => {
    const book = req.body;
    await books.insertOne(book);
    res.status(201).json(book);
});

app.listen(3000, () => {
    console.log('Bookshelf is running on port 3000');
});
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Datenbanken mit MongoDB

Übe selbstständig: Express-Playground