Menu
CoddyTech

Menghapus Dokumen

Termasuk bagian Database dengan MongoDB dalam perjalanan Node.js di Coddy. Pelajaran 16 dari 29.

Menghapus buku hanya memerlukan satu pemanggilan, tetapi server tetap harus memberi tahu client apakah ada buku yang dihapus.

deleteOne(filter) menghapus dokumen pertama yang cocok dan memberikan jawaban { deletedCount }: 1 jika satu dokumen dihapus, 0 jika tidak ada yang cocok. Penghapusan yang berhasil memberikan jawaban 204 No Content, status tanpa isi, yang dikirim dengan res.status(204).end().

const result = await sessions.deleteOne({ token });
if (result.deletedCount === 0) {
    // tidak ada sesi yang memiliki token tersebut
}

Menghapus id yang sama dua kali seharusnya tidak berhasil dua kali. Pada kali kedua, tidak ada lagi yang tersisa, dan client seharusnya menerima 404.

challenge icon

Tantangan

Mudah

Client dapat menghapus buku, dan mereka perlu tahu apakah ada buku yang dihapus.

  1. Di server.js, tambahkan rute DELETE /books/:id. Gunakan parseId untuk id yang tidak valid, yang menghasilkan 400.
  2. Saat rute menghapus buku, berikan respons dengan status 204 tanpa isi sama sekali. Akhiri respons tanpa mengirim JSON.
  3. Jika tidak ada buku dengan _id tersebut, berikan respons dengan status 404 dan error, misalnya { "error": "No such book" }. Jadi, menghapus buku yang sama untuk kedua kalinya juga menghasilkan 404 karena buku itu sudah tidak ada. Coba: Kirim GET /books dan salin _id milik Emma. Kirim DELETE /books/<Emma's _id>: kamu mendapat 204 dan isi respons kosong. Kirim permintaan yang sama lagi: kamu mendapat 404. Kirim GET /books/<Emma's _id>: kamu juga mendapat 404. Kirim GET /books: kamu hanya mendapat Dune dan Kindred, dan tab Data menampilkan dua buku. Tekan tombol “Main” untuk mendapatkan Emma kembali.

Coba sendiri

import express from 'express';
import { MongoClient, ObjectId } 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());

// Setiap error mengembalikan { error: message }.
function sendError(res, status, message) {
    res.status(status).json({ error: message });
}

// Ubah :id menjadi ObjectId, atau kembalikan null setelah mengirim respons 400 untuk id yang tidak valid.
function parseId(req, res) {
    if (ObjectId.isValid(req.params.id)) {
        return new ObjectId(req.params.id);
    }
    sendError(res, 400, 'Not a valid id');
    return null;
}

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

app.get('/books', async (req, res) => {
    const filter = {};
    if (req.query.author) {
        filter.author = req.query.author;
    }
    if (req.query.from || req.query.to) {
        filter.year = {};
        if (req.query.from) {
            filter.year.$gte = Number(req.query.from);
        }
        if (req.query.to) {
            filter.year.$lte = Number(req.query.to);
        }
    }
    const list = await books.find(filter).toArray();
    res.json(list);
});

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

app.get('/books/newest', async (req, res) => {
    const n = Number(req.query.n) || 3;
    const list = await books
        .find({}, { projection: { title: 1, year: 1, _id: 0 } })
        .sort({ year: -1 })
        .limit(n)
        .toArray();
    res.json(list);
});

app.get('/books/:id', async (req, res) => {
    const id = parseId(req, res);
    if (!id) return;
    const book = await books.findOne({ _id: id });
    if (!book) {
        return sendError(res, 404, 'No such book');
    }
    res.json(book);
});

app.patch('/books/:id', async (req, res) => {
    const id = parseId(req, res);
    if (!id) return;
    const result = await books.updateOne({ _id: id }, { $set: req.body });
    if (result.matchedCount === 0) {
        return sendError(res, 404, 'No such book');
    }
    res.json(await books.findOne({ _id: id }));
});

app.post('/books/:id/copies', async (req, res) => {
    const id = parseId(req, res);
    if (!id) return;
    const result = await books.updateOne({ _id: id }, { $inc: { copies: 1 } });
    if (result.matchedCount === 0) {
        return sendError(res, 404, 'No such book');
    }
    res.json(await books.findOne({ _id: id }));
});

app.post('/books/:id/tags', async (req, res) => {
    const id = parseId(req, res);
    if (!id) return;
    const result = await books.updateOne({ _id: id }, { $push: { tags: req.body.tag } });
    if (result.matchedCount === 0) {
        return sendError(res, 404, 'No such book');
    }
    res.json(await books.findOne({ _id: id }));
});

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

Semua pelajaran di Database dengan MongoDB

Latihan sendiri: Playground Express