แบบฝึกหัดต่อยอด
วิธีใช้แบบฝึกหัดชุดนี้
หัวข้อที่มีชื่อว่า “วิธีใช้แบบฝึกหัดชุดนี้”DevBlog สมบูรณ์ในแบบของตัวเองแล้ว แต่โปรเจกต์จริงไม่เคยเสร็จ จะโตต่อทันทีที่มีคนใช้งานจริง แบบฝึกหัดแปดข้อด้านล่างเรียงจากง่ายไปยากคร่าว ๆ และแต่ละข้ออุดช่องที่การสร้างจงใจเปิดไว้ หรือต่อยอดฟีเจอร์ที่คุณมีอยู่แล้ว เลือกทำตามลำดับหรือหยิบเฉพาะข้อที่สนใจ แต่ละข้อเป็นงานบ่ายเดียวที่จบในตัว ไม่ใช่การเขียนใหม่ทั้งหมด ทุกข้อมีคำแนะนำหนึ่งประโยคเพื่อชี้ไปยังเลเยอร์ที่ถูกต้อง — ที่เหลือเป็นของคุณที่จะออกแบบ
แบบฝึกหัด
หัวข้อที่มีชื่อว่า “แบบฝึกหัด”1 · เลื่อนสิทธิ์เป็น admin / seed ให้ผู้ใช้คนแรกเป็น admin
หัวข้อที่มีชื่อว่า “1 · เลื่อนสิทธิ์เป็น admin / seed ให้ผู้ใช้คนแรกเป็น admin”อุดช่องที่ acceptance walk ทำด้วยมือ: เพิ่ม mutation promoteToAdmin ที่มี guard (เรียกได้เฉพาะ admin ที่มีอยู่แล้ว) หรือ seed ที่ทำให้ผู้ใช้คนแรกที่ลงทะเบียนเป็น admin โดยอัตโนมัติ เพื่อให้มีวิธีสร้างผู้ดูแลคนแรกในแอปที่ตรวจสอบย้อนหลังได้ แทนที่จะแก้ Mongo โดยตรง
2 · ค้นหาแบบ full-text ในโพสต์
หัวข้อที่มีชื่อว่า “2 · ค้นหาแบบ full-text ในโพสต์”เพิ่ม GraphQL query searchPosts(query) ที่หนุนหลังด้วย text index ของ MongoDB บนหัวข้อและเนื้อหาโพสต์ คืนเฉพาะโพสต์ที่เผยแพร่แล้วเรียงตามความเกี่ยวข้อง เพื่อให้ผู้อ่านค้นหาเนื้อหาได้โดยไม่ต้องรู้ slug ที่แน่นอน
3 · Cursor-based pagination
หัวข้อที่มีชื่อว่า “3 · Cursor-based pagination”แทนที่ (หรือเพิ่มควบคู่กับ) offset pagination เดิมด้วย pagination แบบ cursor บน query โพสต์ — เข้ารหัส cursor จาก sort key ที่เสถียรอย่าง publishedAt บวก _id — เพื่อให้หน้ายังถูกต้องแม้มีโพสต์ใหม่ถูกเผยแพร่ระหว่างการร้องขอ
4 · อัปโหลดรูปสำหรับ cover image
หัวข้อที่มีชื่อว่า “4 · อัปโหลดรูปสำหรับ cover image”ให้ผู้เขียนแนบภาพปกให้โพสต์ได้โดยรับ upload ใน admin dashboard เก็บไฟล์ไว้ (ดิสก์ในเครื่องสำหรับ development, bucket ที่เข้ากันได้กับ S3 สำหรับ production) แล้วเก็บแค่ URL ลงบน document โพสต์ จากนั้นเรนเดอร์บนหน้าโพสต์สาธารณะและใน SEO metadata
5 · โพสต์ที่เกี่ยวข้องจาก tag ร่วมกัน
หัวข้อที่มีชื่อว่า “5 · โพสต์ที่เกี่ยวข้องจาก tag ร่วมกัน”เพิ่ม resolver relatedPosts(slug) ที่คืนโพสต์ที่เผยแพร่แล้วอื่น ๆ ซึ่งมีแท็กร่วมกับโพสต์ปัจจุบันมากที่สุด เพื่อให้หน้าโพสต์สาธารณะแสดงรายการ “คุณอาจชอบสิ่งเหล่านี้” ได้โดยไม่ต้องคัดเลือกด้วยมือ
6 · ใช้ DataLoader แก้ N+1 ของ author
หัวข้อที่มีชื่อว่า “6 · ใช้ DataLoader แก้ N+1 ของ author”เพิ่ม DataLoader ที่มี scope ต่อ request สำหรับผู้ใช้ แล้วเรียกใช้ภายใน resolver @ResolveField author เพื่อให้การเรนเดอร์รายการโพสต์ N รายการยิงการค้นหาผู้ใช้แบบ batch ครั้งเดียว แทนที่จะเป็น N query แยกกัน — การแก้ N+1 คลาสสิกของ GraphQL
7 · Rate-limit addComment และเพิ่ม honeypot กัน spam
หัวข้อที่มีชื่อว่า “7 · Rate-limit addComment และเพิ่ม honeypot กัน spam”ป้องกัน endpoint คอมเมนต์แบบไม่ระบุตัวตนด้วย rate limit ต่อ IP (ThrottlerGuard ของ NestJS) และ field honeypot ที่ซ่อนไว้ซึ่งผู้ใช้จริงไม่มีวันกรอก แล้วทิ้งทุก submission ที่กรอก field นั้นมา เพื่อไม่ให้คิวตรวจสอบจมไปกับบอต
8 · เทสต์ end-to-end ด้วย Playwright
หัวข้อที่มีชื่อว่า “8 · เทสต์ end-to-end ด้วย Playwright”เขียนชุดเทสต์ Playwright ที่โมดูล testing เพียงร่างไว้: ขับ browser จริงผ่าน flow เต็ม publish→read→comment→moderate กับสแตก Docker Compose ที่กำลังรันอยู่ โดย assert การเปลี่ยนสถานะแต่ละอย่างที่ acceptance walk อธิบายไว้
แบบฝึกหัดแปดข้อนี้ครอบคลุมทั้งสแตกที่คุณสร้าง — auth และการ seed, การทำ index และ pagination ของ MongoDB, การเก็บไฟล์, ประสิทธิภาพ GraphQL, การป้องกันการใช้งานในทางที่ผิด และการเทสต์แบบ end-to-end — และหลายข้ออุดช่องที่คอร์สพูดออกมาตรง ๆ แทนที่จะซ่อนไว้ อย่างการโปรโมต admin ที่ขาดหายและ author N+1 ทำสักสองสามข้อแล้ว DevBlog จะหยุดเป็นผลลัพธ์ของทิวทอเรียลและเริ่มเป็นโปรเจกต์ของคุณ
ถัดไป: ก้าวต่อไป →