สร้างแอป Flashcard ด้วย Next.js และ MongoDB: โปรเจกต์แรกสำหรับมือใหม่หัดเขียนเว็บ

10 นาที 21 views บันทึกเป็น PDF
สร้างแอป Flashcard ด้วย Next.js และ MongoDB: โปรเจกต์แรกสำหรับมือใหม่หัดเขียนเว็บ

อยากทำโปรเจกต์แรกแต่ไม่รู้เริ่มตรงไหน? มาสร้างแอป Flashcard ช่วยจำด้วย Next.js และ MongoDB กัน! ได้เรียนรู้การทำ Full-stack ตั้งแต่เริ่มจนจบ เหมาะมากสำหรับใส่ Portfolio

ทำไมการสร้างแอป Flashcard ถึงเป็นโปรเจกต์เริ่มต้นที่ดีที่สุด

ถ้าคุณเคยต้องอ่านหนังสือสอบแบบอัดแน่นในคืนเดียว คุณคงรู้ดีว่ามันจำอะไรไม่ค่อยได้ Flashcard (บัตรคำช่วยจำ) เป็นเครื่องมือที่ทรงพลังมาก เพราะมันใช้หลักการ Active Recall (การดึงข้อมูลจากสมองด้วยตัวเอง) แทนที่จะแค่อ่านผ่านตาไปเรื่อยๆ งานวิจัยยืนยันว่าการพยายามนึกคำตอบเองจะช่วยให้สมองจดจำข้อมูลได้แม่นยำและยาวนานขึ้นกว่าเดิม

การสร้างแอป Flashcard ขึ้นมาเองไม่ใช่แค่การทำโปรเจกต์สนุกๆ แต่เป็นวิธีฝึกทักษะการเขียนโปรแกรมแบบ Full-stack (การพัฒนาทั้งส่วนหน้าบ้านที่คนเห็นและส่วนหลังบ้านที่เก็บข้อมูล) คุณจะได้เรียนรู้การเก็บข้อมูล การสร้างหน้าเว็บที่โต้ตอบได้ และการเชื่อมต่อฐานข้อมูลเข้าด้วยกัน สิ่งเหล่านี้คือหัวใจสำคัญที่โปรแกรมเมอร์ทุกคนต้องรู้

ในบทความนี้เราจะใช้ Next.js (เฟรมเวิร์กที่ช่วยสร้างเว็บด้วย React ได้ง่ายขึ้น) และ MongoDB (ฐานข้อมูลที่เก็บข้อมูลในรูปแบบคล้ายเอกสาร JSON) มาเป็นตัวช่วยหลัก ไม่ต้องกังวลหากคุณยังไม่เคยทำมาก่อน เราจะค่อยๆ ไปทีละขั้นตอนเพื่อให้คุณมีผลงานชิ้นแรกไปใส่ใน Portfolio (แฟ้มสะสมผลงาน) ของตัวเอง

เตรียมเครื่องมือและโครงสร้างโปรเจกต์

ก่อนจะเริ่มเขียนโค้ด เราต้องเตรียม Environment (สภาพแวดล้อมในการเขียนโปรแกรม) ให้พร้อมก่อน ให้คุณเปิด Terminal (หน้าต่างพิมพ์คำสั่ง) แล้วพิมพ์คำสั่งสร้างโปรเจกต์ Next.js ขึ้นมาใหม่ ระบบจะถามคุณว่าต้องการตั้งค่าอะไรบ้าง ให้เลือกใช้ TypeScript, Tailwind CSS และ App Router ตามค่าเริ่มต้นที่แนะนำได้เลย

เมื่อสร้างโปรเจกต์เสร็จ เราต้องติดตั้ง Mongoose (เครื่องมือที่ช่วยให้เราคุยกับฐานข้อมูล MongoDB ได้ง่ายขึ้น) โดยใช้คำสั่ง npm install mongoose ตัวนี้จะทำหน้าที่เป็นตัวกลางคอยตรวจสอบข้อมูลว่าถูกต้องไหมก่อนจะบันทึกลงฐานข้อมูล เหมือนเป็นด่านตรวจคนเข้าเมืองที่คอยกันข้อมูลมั่วๆ ไม่ให้หลุดเข้าไป

สุดท้ายให้สร้างไฟล์ .env.local เพื่อเก็บ Connection String (ที่อยู่สำหรับเชื่อมต่อฐานข้อมูล) ไว้เป็นความลับ ห้ามเอาไฟล์นี้ขึ้น Git (ที่เก็บโค้ดออนไลน์) เด็ดขาด เพราะมันจะมีรหัสผ่านฐานข้อมูลของคุณอยู่ข้างใน การจัดระเบียบไฟล์ให้ดีตั้งแต่ต้นจะช่วยให้คุณทำงานต่อได้ง่ายและไม่สับสนเมื่อโปรเจกต์ขยายใหญ่ขึ้น

# สร้างโปรเจกต์ใหม่
npx create-next-app@latest flash-cards --typescript --tailwind --app

# ติดตั้ง Mongoose
npm install mongoose

คำสั่งแรก create-next-app คือการโหลดโครงสร้างเว็บมาตรฐานมาให้เรา ส่วน npm install คือการดาวน์โหลดเครื่องมือเสริมมาเพิ่ม ผลลัพธ์ที่ได้คือโฟลเดอร์ชื่อ flash-cards ที่พร้อมให้คุณเริ่มเขียนโค้ดได้ทันที

เชื่อมต่อกับฐานข้อมูล MongoDB

การเชื่อมต่อฐานข้อมูลใน Next.js ต้องระวังเรื่องการเปิดการเชื่อมต่อซ้ำซ้อน เพราะ Next.js จะโหลดโค้ดใหม่ทุกครั้งที่แก้ไข เราจึงต้องมีไฟล์ Utility (โค้ดตัวช่วยที่ใช้ซ้ำได้) เพื่อเช็คว่าเราเคยเชื่อมต่อไว้แล้วหรือยัง ถ้ามีแล้วก็ให้ใช้ตัวเดิม ไม่ต้องเสียเวลาสร้างใหม่ให้เปลืองทรัพยากร

เราจะสร้างไฟล์ src/lib/db.ts ขึ้นมาเพื่อเก็บโค้ดส่วนนี้ การใช้ Global Cache (การเก็บค่าไว้ในหน่วยความจำกลางของแอป) จะช่วยให้มั่นใจว่าแอปของเราจะเชื่อมต่อกับ MongoDB ได้อย่างเสถียรไม่ว่าจะมีการรีเฟรชหน้าเว็บกี่ครั้งก็ตาม นี่คือสิ่งที่มือโปรเขาทำกันเพื่อป้องกันปัญหาฐานข้อมูลล่มจากการเชื่อมต่อมากเกินไป

จำไว้ว่า Database Connection (การเชื่อมต่อฐานข้อมูล) คือหัวใจสำคัญ หากจุดนี้พังแอปคุณจะบันทึกอะไรไม่ได้เลย ดังนั้นให้ทดสอบการเชื่อมต่อด้วยการพิมพ์ข้อความแจ้งเตือนใน Console (หน้าต่างแสดงผลสำหรับนักพัฒนา) เพื่อยืนยันว่าทุกอย่างทำงานได้อย่างถูกต้องก่อนจะเริ่มสร้างฟีเจอร์อื่นๆ ต่อไป

// src/lib/db.ts
import mongoose from "mongoose";

const MONGODB_URI = process.env.MONGODB_URI || "mongodb://localhost:27017/flashcards";

async function dbConnect() {
  // ถ้าเชื่อมต่ออยู่แล้ว ให้ใช้ตัวเดิม
  if (mongoose.connection.readyState >= 1) return;
  // ถ้ายังไม่เชื่อมต่อ ให้เริ่มการเชื่อมต่อ
  return mongoose.connect(MONGODB_URI);
}
export default dbConnect;

โค้ดนี้ใช้ mongoose.connect เพื่อเรียกฐานข้อมูลขึ้นมาทำงาน ส่วน readyState คือตัวเช็คสถานะว่าตอนนี้เราต่ออยู่ไหม หากรันสำเร็จ คุณจะไม่เห็นข้อผิดพลาดใดๆ ในหน้า Terminal

ออกแบบโครงสร้างข้อมูลด้วย Mongoose Models

ก่อนเก็บข้อมูล เราต้องกำหนด Schema (โครงสร้างของข้อมูล) ก่อน เหมือนกับการออกแบบตารางในสมุดจดว่าช่องนี้ต้องเป็นคำถาม ช่องนี้ต้องเป็นคำตอบ สำหรับแอปนี้เราต้องการ 3 ส่วนหลักคือ Subject (หัวข้อวิชา), Flashcard (บัตรคำ), และ Progress (ความคืบหน้าในการเรียน)

การกำหนดโครงสร้างที่ชัดเจนจะช่วยให้คุณเขียนโค้ดได้ง่ายขึ้นมาก เพราะเวลาเรียกใช้ข้อมูล คุณจะรู้ทันทีว่ามีฟิลด์ไหนให้ใช้งานบ้าง เช่น question เป็นข้อความ answer เป็นข้อความ และ isCorrect เป็นค่าจริงเท็จสำหรับเช็คว่าจำได้ไหม มือใหม่มักพลาดตรงที่ลืมกำหนดประเภทข้อมูลให้ชัดเจน ทำให้โปรแกรมเออเร่อเวลาข้อมูลไม่ตรงกัน

ลองนึกภาพว่าคุณกำลังสร้างแบบฟอร์มให้คนกรอก ถ้าเราบังคับได้ว่าช่องคำถามต้องห้ามว่าง มันจะช่วยลดความผิดพลาดได้มหาศาล การมี Schema ที่แข็งแรงคือจุดเริ่มต้นของแอปที่มีคุณภาพ และช่วยให้การทำระบบแก้ไขหรือลบข้อมูลในอนาคตทำได้ง่ายขึ้นโดยไม่กระทบส่วนอื่นๆ

// ตัวอย่างโครงสร้างบัตรคำ
const FlashcardSchema = new mongoose.Schema({
  question: { type: String, required: true },
  answer: { type: String, required: true },
  subjectId: { type: mongoose.Schema.Types.ObjectId, ref: 'Subject' }
});

บรรทัด type: String บอกว่าข้อมูลต้องเป็นตัวอักษร ส่วน required: true คือการบังคับว่าห้ามเว้นว่างเด็ดขาด หากคุณพยายามบันทึกข้อมูลที่ไม่มีคำถาม ระบบจะแจ้งเตือนความผิดพลาดออกมาทันที

สร้าง API Route เพื่อรับส่งข้อมูล

ใน Next.js เราสามารถสร้าง API Routes (เส้นทางรับส่งข้อมูลหลังบ้าน) ได้ภายในโปรเจกต์เดียวกันเลย ไม่ต้องเขียนเซิร์ฟเวอร์แยกต่างหาก คุณจะใช้คำสั่ง GET เพื่อดึงข้อมูลมาแสดง หรือ POST เพื่อบันทึกบัตรคำใหม่ลงฐานข้อมูล การทำแบบนี้ทำให้หน้าเว็บของคุณคุยกับฐานข้อมูลได้โดยตรงผ่านคำสั่งง่ายๆ

หัวใจสำคัญคือการจัดการ Request (คำขอที่ส่งมาจากหน้าเว็บ) ให้ถูกต้อง คุณต้องคอยเช็คเสมอว่าผู้ใช้ส่งข้อมูลมาครบไหม ถ้าส่งมาไม่ครบต้องรีบตอบกลับด้วย Error เพื่อให้หน้าเว็บแจ้งเตือนผู้ใช้ได้ทันที การเขียนโค้ดส่วนนี้ต้องใจเย็นๆ เพราะถ้าผิดพลาดนิดเดียว ข้อมูลอาจไม่ถูกบันทึกลงฐานข้อมูล

อย่าลืมทำระบบ Dynamic Routes (เส้นทางที่เปลี่ยนไปตามข้อมูล) เช่น /api/subjects/[id] เพื่อให้คุณสามารถแก้ไขหรือลบวิชาเฉพาะเจาะจงได้ การใช้เลข ID ที่ไม่ซ้ำกันช่วยให้เราชี้เป้าไปที่ข้อมูลที่ต้องการได้อย่างแม่นยำ เหมือนการมีเลขที่บ้านที่ระบุตัวตนของข้อมูลแต่ละชิ้นไว้อย่างชัดเจน

// ตัวอย่าง API รับบัตรคำ
export async function POST(req: Request) {
  const body = await req.json();
  const newCard = await Flashcard.create(body);
  return Response.json(newCard);
}

โค้ดนี้รอรับข้อมูลที่ส่งมาจากหน้าเว็บแล้วบันทึกลง MongoDB ทันที ถ้าสำเร็จมันจะส่งข้อมูลที่บันทึกแล้วกลับไปให้หน้าเว็บเพื่อเอาไปแสดงผลต่อได้เลย

สร้างหน้า UI สำหรับการเรียนรู้

มาถึงส่วนที่สนุกที่สุดคือการสร้างหน้าตาแอป เราจะใช้ Tailwind CSS ในการแต่งหน้าเว็บให้สวยงามและอ่านง่าย การทำปุ่ม "พลิกการ์ด" สามารถใช้ CSS Animation (การเคลื่อนไหวของหน้าเว็บ) ง่ายๆ เพื่อให้รู้สึกเหมือนเรากำลังพลิกบัตรคำจริงๆ ในมือ มันจะช่วยสร้างประสบการณ์การใช้งานที่ดีและทำให้คนอยากกลับมาเรียนบ่อยๆ

หัวใจของการเรียนรู้คือ "ความสนุก" ดังนั้นในหน้า Study Page ให้ทำระบบสุ่มคำถามและมีปุ่มให้กดว่า "จำได้" หรือ "จำไม่ได้" ข้อมูลนี้จะถูกส่งไปบันทึกใน Progress เพื่อให้ผู้ใช้เห็นกราฟความก้าวหน้าของตัวเอง การเห็นพัฒนาการของตัวเองเป็นแรงจูงใจที่ดีที่สุด สำหรับคนที่กำลังฝึกฝนอะไรใหม่ๆ อยู่เสมอ

สิ่งที่ต้องระวังคือการจัดการ State (สถานะของหน้าเว็บ) ใน React เช่น เมื่อกดพลิกการ์ดแล้วต้องเปลี่ยนหน้าหรือเปลี่ยนข้อความ อย่าลืมตรวจสอบให้แน่ใจว่าเมื่อผู้ใช้กดปุ่มแล้ว แอปจะตอบสนองทันทีโดยไม่หน่วง ถ้าแอปช้าเกินไป ผู้ใช้อาจจะเบื่อและเลิกใช้งานไปก่อนจะจำอะไรได้

สรุปบทเรียนและการนำไปใช้

ตอนนี้คุณมีแอป Flashcard ที่ทำงานได้จริงแล้ว ตั้งแต่การเชื่อมต่อฐานข้อมูล การออกแบบโครงสร้าง ไปจนถึงหน้าตาเว็บที่โต้ตอบได้ สิ่งที่คุณได้เรียนรู้ในวันนี้ไม่ใช่แค่การสร้างแอป แต่คือการเข้าใจกระบวนการทำงานของระบบเว็บสมัยใหม่ที่เชื่อมต่อกับฐานข้อมูลจริงๆ ซึ่งนี่คือทักษะที่บริษัทซอฟต์แวร์มองหาในตัวโปรแกรมเมอร์

ก้าวต่อไปคือการต่อยอด เช่น เพิ่มระบบล็อกอินเพื่อให้ผู้ใช้แต่ละคนมีข้อมูลเป็นของตัวเอง หรือเพิ่มฟีเจอร์นำเข้าข้อมูลจากไฟล์ Excel ถ้าคุณทำได้ แอปของคุณก็จะกลายเป็นเครื่องมือที่ใช้งานได้จริงในชีวิตประจำวัน และเป็นโปรเจกต์ที่โดดเด่นใน Portfolio ของคุณอย่างแน่นอน

จำไว้ว่าการเขียนโค้ดเป็นทักษะที่ต้องใช้การฝึกฝน อย่าท้อถ้าเจอบั๊กหรือข้อผิดพลาดตั้งแต่วันแรก เพราะนั่นคือจุดที่ทำให้คุณเก่งขึ้น ขอให้สนุกกับการปรับปรุงแอปของคุณให้ดีขึ้นเรื่อยๆ เพราะโปรแกรมเมอร์ที่เก่งที่สุดไม่ใช่คนที่เขียนโค้ดไม่เคยพลาด แต่คือคนที่แก้ปัญหาเก่งและไม่เคยหยุดเรียนรู้ครับ


ที่มา: How to Build a Flashcard Study App with Next.js and MongoDB — freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

แชร์บทความ

Facebook X LINE

บทความที่เกี่ยวข้อง

เทคนิคเขียนแอป Flutter สำหรับ Meta Smart Glasses ให้ลื่นไหลและมีประสิทธิภาพ

เทคนิคเขียนแอป Flutter สำหรับ Meta Smart Glasses ให้ลื่นไหลและมีประสิทธิภาพ

เรียนรู้วิธีเขียนแอป Flutter เชื่อมต่อ Meta Smart Glasses ให้ทำงานเร็ว ไม่กระตุก ด้วยการวางสถาปัตยกรรมโค้ดและการจัดการข้อมูลแบบมือโปรที่มือใหม่ทำตามได้จริง

ที่มา: DEV Community

3 hours ago 10 นาที
5 views
เปรียบเทียบ WebSocket, SSE และ Polling เลือกวิธีทำระบบ Real-Time ให้เหมาะกับงาน

เปรียบเทียบ WebSocket, SSE และ Polling เลือกวิธีทำระบบ Real-Time ให้เหมาะกับงาน

อยากทำระบบ Real-Time แต่ไม่รู้จะเลือกใช้ Polling, SSE หรือ WebSocket ดี? มาดูวิธีเลือกใช้ให้เหมาะกับงาน เพื่อให้แอปของคุณทำงานลื่นไหลและประหยัดทรัพยากรเซิร์ฟเวอร์

ที่มา: DEV Community

7 hours ago 10 นาที
4 views