Menu
CoddyTech

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');                            // false

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

challenge icon

Aufgabe

Einfach
  • GET /books/:id gibt das Buch mit dieser _id zurück.
  • Eine ID, die keine ObjectId sein kann, gibt 400 zurück.
  • Eine gültige ID ohne zugehöriges Buch gibt 404 zurü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');
});
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