Menu
CoddyTech

Rute Bersarang

Termasuk bagian Dasar-Dasar Express dalam perjalanan Node.js di Coddy. Pelajaran 20 dari 23.

Ulasan termasuk dalam satu resep, jadi URL-nya berada di bawah resep tersebut: /api/recipes/2/reviews.

const chapters = express.Router({ mergeParams: true });

chapters.get('/', (req, res) => {
    res.json(chaptersOf(req.params.isbn));
});

app.use('/api/books/:isbn/chapters', chapters);

req.params pada sebuah router hanya menyimpan parameter dari jalurnya sendiri. :isbn pada jalur pemasangan adalah milik app, jadi nilainya di dalam router adalah undefined, kecuali router dibuat dengan mergeParams: true.

routes/reviews.js sudah siap, dengan objek reviews dan helper hasRecipe(id).

challenge icon

Tantangan

Mudah

Pengunjung dapat meninggalkan ulasan untuk sebuah resep. Ulasan terkait dengan satu resep, jadi URL-nya berada di bawah resep tersebut: /api/recipes/1/reviews.

  1. Di routes/reviews.js, buat router dapat membaca id resep dari path tempat router dipasang. Tanpa itu, req.params.id bernilai undefined di dalam router (lihat teks pelajaran).
  2. Tambahkan rute GET untuk /. Rute ini mengembalikan ulasan resep tersebut sebagai list JSON, atau list kosong, [], jika belum ada ulasan. Simpan ulasan dalam object reviews, satu list untuk setiap id resep, seperti { "1": [{ "stars": 5, "text": "Lovely" }] }.
  3. Tambahkan rute POST untuk /. Rute ini membaca stars dan text dari body, menambahkan ulasan ke list resep tersebut, lalu merespons dengan status 201 dan ulasan itu: {"stars": 5, "text": "Lovely"}. Simpan dan kirim hanya dua field tersebut.
  4. Di kedua rute, ketika hasRecipe(id) bernilai false, respons dengan status 404 dan {"error": "No such recipe"}.
  5. Di server.js, impor router dan pasang di /api/recipes/:id/reviews, di samping router resep dan sebelum handler 404.

Coba: Tekan tombol “Jalankan” dan kirim /api/recipes/1/reviews: []. Pilih POST dan kirim {"stars": 5, "text": "Lovely"} ke /api/recipes/1/reviews: status 201 dan ulasannya. Kirim GET ke /api/recipes/1/reviews lagi: [{"stars":5,"text":"Lovely"}]. Kirim /api/recipes/2/reviews: hasilnya tetap [], karena setiap resep menyimpan ulasannya sendiri. Kirim /api/recipes/99/reviews: status 404 dan {"error":"No such recipe"}.

Coba sendiri

import express from 'express';
import { recipes } from '../data.js';

// Ulasan berdasarkan id resep, seperti { 1: [{ stars: 5, text: 'Lovely' }] }.
const reviews = {};

const hasRecipe = (id) => recipes.some((recipe) => recipe.id === Number(id));

const router = express.Router();

// GET / menampilkan daftar ulasan suatu resep. POST / menambahkan satu ulasan.

export default router;

Semua pelajaran di Dasar-Dasar Express

Latihan sendiri: Playground Express