Thuta Learning
ရှာဖွေရန်
ExercisesWeb Developmentbeginner

Practice: Express Routing, Async/Await & Mini REST API

စိတ်လျှော့ပါ။ ဒီခန်းကို စာအုပ်လိုမဟုတ်ဘဲ စကားပြောသလိုပဲ၊ နားလည်လွယ်အောင် ရှင်းပါမယ်။

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Practice: Express Routing, Async/Await & Mini REST API ကို ကိုယ်တိုင် လေ့ကျင့်ကြည့်မယ်
  • သင်ခဲ့ပြီးသား skill တွေကို practice လုပ်ပြီး ခိုင်မာအောင်လုပ်မယ်
  • အမှားရှာ၊ ပြင်တတ်၊ ကိုယ်တိုင် check လုပ်တတ်မယ်

ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်

ဒီ lesson က Express Intro, Express Routing, Async & Promises, API Intro/GET/POST သင်ခန်းစာတွေရဲ့ knowledge ကို ပေါင်းစပ်ပြီး ပိုကျယ်ပြန့်တဲ့ practice တွေ လုပ်ကြည့်ဖို့ ရည်ရွယ်ပါတယ်။ Task အားလုံးက ပထမ lesson ထက် တစ်ဆင့်တိုးပြီး route parameter, async function, နဲ့ in-memory array ကို data store အဖြစ်သုံးပြီး CRUD flow တစ်ခုလုံးကို ကိုယ်တိုင်ရေးရပါမယ်။ Real project မှာ database မတပ်ခင် logic ကို ဒီလိုသေချာစမ်းသပ်ထားရင် နောက်ပိုင်း database ချိတ်ရတာ ပိုလွယ်ကူသွားပါလိမ့်မယ်။ Task တစ်ခုချင်းစီကို Postman ဒါမှမဟုတ် browser ကနေ request ပို့ပြီး result ကို confirm လုပ်ပါ။

လေ့ကျင့်ခန်းများ

Task 1: Express app တစ်ခုတည်ဆောက်ပြီး in-memory array 'books' (id, title, author) ကို GET /books route နဲ့ ပြန်ပေးပါ။ Task 2: GET /books/:id route ထည့်ပြီး id နဲ့ book မတွေ့ရင် status 404 နဲ့ error message ပြန်ပေးပါ။ Task 3: POST /books route ဖန်တီးပြီး express.json() middleware သုံးကာ request body ကနေ book အသစ်တစ်ခု array ထဲ push လုပ်ပါ - id ကို auto-increment ဖြစ်အောင် ရေးပါ။ Task 4: setTimeout ကို Promise နဲ့ wrap ထားတဲ့ delay() helper function တစ်ခုရေးပြီး, async/await သုံးကာ GET /books/:id route ထဲမှာ 'database ကနေရှာနေသလို' 500ms delay ထည့်ကြည့်ပါ။

Code နမူနာ

javascript
const express = require('express');
const app = express();
app.use(express.json());

let books = [
  { id: 1, title: 'Node.js Basics', author: 'Aung' },
  { id: 2, title: 'Express Guide', author: 'Su' }
];

const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

// Task 1
app.get('/books', (req, res) => {
  res.json(books);
});

// Task 2 + 4: param + async delay
app.get('/books/:id', async (req, res) => {
  await delay(500); // simulate database lookup
  const book = books.find((b) => b.id === Number(req.params.id));
  if (!book) {
    return res.status(404).json({ error: 'Book not found' });
  }
  res.json(book);
});

// Task 3
app.post('/books', (req, res) => {
  const { title, author } = req.body;
  if (!title || !author) {
    return res.status(400).json({ error: 'title and author required' });
  }
  const newBook = { id: books.length + 1, title, author };
  books.push(newBook);
  res.status(201).json(newBook);
});

app.listen(3000, () => console.log('API running on port 3000'));
You should see
GET /books က book list ကို JSON array အနေနဲ့ ပြန်ပေးပြီး, GET /books/:id က 500ms စောင့်ပြီးမှ book တစ်ခုချင်း (ဒါမှမဟုတ် 404) ပြန်ပေးကာ, POST /books ဖြင့် body ပို့ရင် array ထဲကို book အသစ် ထပ်ထည့်ပါလိမ့်မယ်။

၅ မိနစ် စမ်းကြည့်

5 minute အတွင်း DELETE /books/:id route အသစ်တစ်ခု ထပ်ရေးပြီး, array.filter() သုံးကာ id နဲ့ book ကို array ထဲကနေ ဖယ်ထုတ်နိုင်အောင် စမ်းကြည့်ပါ။

သတိလေးတစ်ချက်

async route handler ထဲမှာ error တက်နိုင်တဲ့ code ကို try/catch နဲ့ ဖုံးမထားရင် server crash ဖြစ်နိုင်ပါတယ် - production မှာဆို error-handling middleware တစ်ခုနဲ့အတူ တွဲသုံးပါ။

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • app.use(express.json()) middleware ကို route တွေမတိုင်ခင် မထည့်ဘဲ POST route ထဲမှာ req.body ကို ဖတ်ကြည့်လို့ undefined ရခြင်း
  • req.params.id က string type ဖြစ်နေတာကို သတိမထားဘဲ Number() နဲ့ မ convert လုပ်ဘဲ === နဲ့ တိုက်ရိုက်နှိုင်းယှဉ်လို့ book ရှာမတွေ့ခြင်း

အခု ကိုယ်တိုင် စမ်းကြည့်

5 minute အတွင်း DELETE /books/:id route အသစ်တစ်ခု ထပ်ရေးပြီး, array.filter() သုံးကာ id နဲ့ book ကို array ထဲကနေ ဖယ်ထုတ်နိုင်အောင် စမ်းကြည့်ပါ။

You'll know it worked when: GET /books က book list ကို JSON array အနေနဲ့ ပြန်ပေးပြီး, GET /books/:id က 500ms စောင့်ပြီးမှ book တစ်ခုချင်း (ဒါမှမဟုတ် 404) ပြန်ပေးကာ, POST /books ဖြင့် body ပို့ရင် array ထဲကို book အသစ် ထပ်ထည့်ပါလိမ့်မယ်။

Practice: Express Routing, Async/Await & Mini REST API | Thuta Learning