Ü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'); // falsefindOne gibt das erste passende Dokument zurück oder null, wenn keines passt.
Aufgabe
EinfachDieser 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.
- Füge in
server.jseineGET /books/:id-Route hinzu. - 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
sendErrorverwendest, 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. - 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" }. - Wenn kein Buch diese
_idhat, antworte mit Status 404 und einem Fehler, zum Beispiel{ "error": "No such book" }. Probiere es aus: SendeGET /booksund 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. SendeGET /books/, gefolgt von der kopierten ID: Du erhältst Status 200 und Dune. SendeGET /books/42: Du erhältst Status 400. SendeGET /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');
});
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
1Dokumente
Ein Buch als DokumentSammlungen und DatenbankenVerbindung zu MongoDB herstellenGespeicherte Dokumente lesenDokumente einfügenEin Dokument findenÜber ObjectId suchenZahlen vergleichenAbfragefilterZurückgegebene Felder auswählenAbfrageergebnisse sortierenDie ersten Ergebnisse behaltenProjektion, Sortierung und LimitÜbe selbstständig: Express-Playground