Suche nach ObjectId
Teil des Abschnitts Datenbanken mit MongoDB der Node.js-Journey von Coddy. Lektion 3 von 18.
Um ein Buch abzurufen, sucht der Server es anhand von _id heraus, aber die ID kommt in der URL als Text an.
Eine von MongoDB erstellte _id ist ein ObjectId: ein 12 Byte großer Wert, der als 24 Hexadezimalzeichen geschrieben wird. In JSON wird es als Zeichenfolge dargestellt, aber in der Datenbank ist es keine, daher findet ein Filter mit dem reinen Text nichts. Wandle den Text zuerst in ein ObjectId um. ObjectId.isValid gibt an, ob ein Text ein solches sein kann, denn new ObjectId löst bei allem anderen 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
EinfachGET /books/:idgibt das Buch mit dieser_idzurück.- Eine ID, die keine ObjectId sein kann, gibt
400zurück. - Eine gültige ID ohne zugehöriges Buch gibt
404zurück.
Kopiere eine _id aus GET /books und sende GET /books/<id>. Sende dann GET /books/42.
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());
// Bei jedem Fehler wird { error: message } zurückgegeben.
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
Verbindung mit MongoDB herstellenDokumente einfügen