Menu
CoddyTech

Rechercher par ObjectId

Fait partie de la section Bases de données avec MongoDB du Journey Node.js de Coddy. Leçon 7 sur 29.

Pour récupérer un livre, le serveur le recherche à partir de son _id, mais l’identifiant arrive sous forme de texte dans l’URL.

Un _id créé par MongoDB est un ObjectId : une valeur de 12 octets écrite sous forme de 24 caractères hexadécimaux : les chiffres de 0 à 9 et les lettres de a à f. JSON l’affiche sous forme de chaîne, mais ce n’est pas le cas dans la base de données ; un filtre utilisant le texte brut ne correspond donc à rien. Convertis d’abord le texte en ObjectId. ObjectId.isValid indique si un texte peut être un ObjectId, car new ObjectId provoque une erreur dans les autres cas.

import { ObjectId } from 'mongodb';

const text = '66f1c2a9e4b0a1b2c3d4e5f6';
await orders.findOne({ _id: new ObjectId(text) }); // la commande, ou null
await orders.findOne({ _id: text });               // null : text n’est pas un ObjectId
ObjectId.isValid('42');                            // false

findOne renvoie le premier document correspondant, ou null si aucun ne correspond.

challenge icon

Défi

Facile

Cette étape ouvre le projet d’API de bibliothèque préparé pour le cours, plutôt que les fichiers de votre projet de Insertion de documents (y compris server.js). Votre travail précédent reste dans sa propre leçon. Lisez les fichiers fournis avant de modifier server.js. Cette copie contient les routes de liste et d’insertion des livres.

Un client veut un livre, choisi par son _id.

  1. Dans server.js, ajoutez une route GET /books/:id.
  2. L’identifiant dans l’URL est du texte. Certains textes ne peuvent jamais être un ObjectId, qui contient 24 caractères composés de chiffres et des lettres de a à f. Pour ce texte, répondez avec le statut 400 et une erreur, en utilisant sendError, par exemple { "error": "Not a valid id" }. Vérifiez cela avant de construire un ObjectId, car en construire un à partir d’un texte incorrect provoque une erreur.
  3. Sinon, recherchez le livre à partir de son _id. Lorsque vous le trouvez, répondez avec le statut 200 et le livre : { "_id": "6720a1f4c2b9e81d3a5f0c11", "title": "Dune", "author": "Frank Herbert", "year": 1965, "isbn": "9780441013593", "genre": "scifi" }.
  4. Lorsqu’aucun livre ne possède cet _id, répondez avec le statut 404 et une erreur, par exemple { "error": "No such book" }. Essayez : envoyez GET /books et copiez l’_id de Dune : les 24 caractères qui suivent "_id":. Chaque fois que vous cliquez sur « Jouer », les livres reçoivent de nouveaux identifiants ; copiez donc l’identifiant à nouveau après chaque clic sur « Jouer ». Envoyez GET /books/ suivi de l’identifiant que vous avez copié : vous obtenez 200 et Dune. Envoyez GET /books/42 : vous obtenez 400. Envoyez GET /books/000000000000000000000000 : c’est un identifiant valide qu’aucun livre ne possède, vous obtenez donc 404.

Essayez vous-même

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());

// Chaque erreur renvoie { 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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Bases de données avec MongoDB

Entraînez-vous par vous-même : Playground Express