0Pricing
React Academy · บทเรียน

การใช้สตรีม SSE ใน React ด้วย EventSource

เชื่อมต่อกับปลายทาง SSE ด้วย EventSource ใน useEffect และแสดงข้อมูลที่สตรีมแบบเรียลไทม์

การใช้สตรีม SSE ใน React ด้วย EventSource เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

การสร้างการเชื่อมต่อ EventSource

new EventSource(url) สร้างการเชื่อมต่อ SSE ไปยัง URL ที่ระบุ เบราว์เซอร์จะเปิดคำขอ HTTP GET ทันทีพร้อมส่วนหัว Accept: text/event-stream เซิร์ฟเวอร์จะคงการเชื่อมต่อนี้ไว้และสตรีมเหตุการณ์ การใช้ EventSource เป็นการใช้ API ที่มีมาในเบราว์เซอร์ จึงไม่ต้องติดตั้งไลบรารีสำหรับการใช้งานพื้นฐาน

สถานะวงจรชีวิตการเชื่อมต่อ

EventSource มีสถานะพร้อมใช้งาน 3 สถานะ: 0 (CONNECTING) — กำลังสร้างหรือสร้างการเชื่อมต่อใหม่ 1 (OPEN) — สร้างการเชื่อมต่อแล้วและกำลังส่งเหตุการณ์ 2 (CLOSED) — ปิดการเชื่อมต่อแล้วและจะไม่เชื่อมต่อใหม่ ตรวจสอบ eventSource.readyState เพื่อดูสถานะปัจจุบัน

onmessage สำหรับเหตุการณ์ทั่วไป

ตัวจัดการ eventSource.onmessage จะทำงานกับเหตุการณ์จากเซิร์ฟเวอร์ที่ไม่มีประเภทเหตุการณ์ระบุไว้อย่างชัดเจน (เซิร์ฟเวอร์ส่ง data: ... โดยไม่มีฟิลด์ event:) ตัวจัดการจะได้รับออบเจ็กต์เหตุการณ์ โดย event.data เป็นข้อมูลส่วนเนื้อหาประเภทสตริง โดยทั่วไปเซิร์ฟเวอร์จะใช้ JSON.stringify กับข้อมูล ดังนั้นเมื่อได้รับข้อมูล คุณจึงใช้ JSON.parse เพื่อแยกวิเคราะห์ได้

เหตุการณ์กำหนดชื่อเอง

เซิร์ฟเวอร์สามารถส่งเหตุการณ์ที่มีชื่อได้: event: userJoined data: {"userId": "123"} ในเบราว์เซอร์ ให้รับฟังด้วย eventSource.addEventListener('userJoined', handler) วิธีนี้ช่วยให้รวมเหตุการณ์หลายประเภทไว้ในการเชื่อมต่อ SSE เดียว โดยแต่ละประเภทเหตุการณ์มีตัวจัดการของตนเอง ทำให้โค้ดเป็นระเบียบและอ่านเข้าใจง่าย

การแยกวิเคราะห์ event.data

ข้อมูล SSE มาถึงในรูปสตริง สำหรับข้อมูลที่มีโครงสร้าง เซิร์ฟเวอร์จะส่ง JSON.stringify(payload) แล้วลูกข่ายจะแยกวิเคราะห์ด้วย const data = JSON.parse(event.data) โปรดครอบการเรียก JSON.parse ด้วยบล็อก try/catch เสมอ เพื่อจัดการ JSON ที่ไม่ถูกต้องจากเซิร์ฟเวอร์อย่างเหมาะสม โดยบันทึกข้อผิดพลาดและข้ามเหตุการณ์ที่มีรูปแบบไม่ถูกต้อง

useEffect สำหรับวงจรชีวิตของ EventSource

สร้างและปิด EventSource ภายใน useEffect โดยสร้างการเชื่อมต่อเมื่อติดตั้งคอมโพเนนต์ เพิ่มตัวจัดการเหตุการณ์ และส่งคืนฟังก์ชันล้างทรัพยากรที่เรียก eventSource.close() หากไม่มีการล้างทรัพยากร การเชื่อมต่อจะรั่วไหลเมื่อถอดคอมโพเนนต์ออก เมื่อลูกข่ายนำทางไปที่อื่น หรือเมื่อเอฟเฟกต์ทำงานใหม่ด้วยการพึ่งพาที่ต่างกัน

การอัปเดตสถานะเมื่อมีข้อความ

ภายในตัวจัดการ eventSource.onmessage ให้อัปเดตสถานะของ React เพื่อสะท้อนข้อมูลใหม่: setMessages(prev => [...prev, JSON.parse(event.data)]) ใช้รูปแบบฟังก์ชันของ setState เพื่อหลีกเลี่ยงปัญหาคลอเชอร์ที่ค้างค่า ตัวจัดการเหตุการณ์จะจับค่าของสถานะเริ่มต้นไว้ แต่การอัปเดตแบบฟังก์ชันจะทำให้คุณใช้ค่าของสถานะล่าสุดได้เสมอ

การเชื่อมต่อใหม่โดยอัตโนมัติ

EventSource จะเชื่อมต่อใหม่โดยอัตโนมัติเมื่อการเชื่อมต่อขาดหายเนื่องจากข้อผิดพลาดของเครือข่ายหรือการเริ่มเซิร์ฟเวอร์ใหม่ เบราว์เซอร์จะรอช่วงเวลาสั้น ๆ (โดยทั่วไป 3 วินาที และเซิร์ฟเวอร์สามารถกำหนดค่าได้ผ่าน retry: 3000 ในสตรีม) จากนั้นจึงเชื่อมต่อใหม่ คุณไม่จำเป็นต้องเขียนตรรกะการเชื่อมต่อใหม่เอง เพราะตรรกะนี้มีมาให้ในส่วนติดต่อโปรแกรมของ EventSource แล้ว

ส่วนหัว Last-Event-ID

EventSource จะติดตามรหัสเหตุการณ์ล่าสุดที่ได้รับ (เซิร์ฟเวอร์ตั้งค่าโดยใช้ id: 123 ในสตรีม) เมื่อเชื่อมต่อใหม่ เบราว์เซอร์จะส่งรหัสนี้โดยอัตโนมัติในส่วนหัว HTTP Last-Event-ID เซิร์ฟเวอร์ที่ออกแบบมาอย่างดีจะใช้รหัสนี้เล่นเหตุการณ์ที่พลาดไปซ้ำ เพื่อให้แน่ใจว่าไม่มีเหตุการณ์ใดสูญหายระหว่างการเชื่อมต่อใหม่

การส่งข้อมูลรับรองและส่วนหัว

EventSource ไม่รองรับส่วนหัวแบบกำหนดเองโดยตรง สำหรับการยืนยันตัวตน ให้ใช้คุกกี้ (new EventSource(url, { withCredentials: true }) จะส่งคุกกี้ไปด้วย) หรือใส่โทเค็นยืนยันตัวตนเป็นพารามิเตอร์คำค้นหาใน URL หากจำเป็นต้องใช้ส่วนหัว Authorization ให้ใช้ส่วนติดต่อ Fetch ร่วมกับ ReadableStream แทน EventSource เพื่อประมวลผลการตอบกลับ SSE ด้วยตนเอง

การจัดการข้อผิดพลาดของการเชื่อมต่อ

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

การเชื่อมต่อ EventSource ใหม่โดยอัตโนมัติ

จะเกิดอะไรขึ้นเมื่อการเชื่อมต่อ EventSource ถูกตัดเนื่องจากข้อผิดพลาดของเครือข่าย

ทบทวนบทเรียน: EventSource ใน React

การสร้างการเชื่อมต่อด้วย EventSource จะมีสถานะ readyStates ได้แก่ CONNECTING, OPEN และ CLOSED ตัวจัดการข้อความจะจัดการเหตุการณ์ทั่วไป ส่วน addEventListener จะจัดการประเภทเหตุการณ์ที่ระบุ JSON.parse(event.data) ใช้ดึงข้อมูลที่มีโครงสร้าง สร้างและล้าง EventSource ภายใน useEffect การเชื่อมต่อใหม่โดยอัตโนมัติมีมาให้ในตัว — EventSource จะลองใหม่หลังเกิดข้อผิดพลาดเครือข่ายพร้อมใช้ Last-Event-ID เพื่อเล่นเหตุการณ์ที่พลาดไปซ้ำ ยืนยันตัวตนผ่านคุกกี้ (withCredentials) หรือพารามิเตอร์คำค้นหาใน URL

คำถามที่พบบ่อย

บทเรียน “การใช้สตรีม SSE ใน React ด้วย EventSource” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การใช้สตรีม SSE ใน React ด้วย EventSource” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การใช้สตรีม SSE ใน React ด้วย EventSource”

เชื่อมต่อกับปลายทาง SSE ด้วย EventSource ใน useEffect และแสดงข้อมูลที่สตรีมแบบเรียลไทม์ คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การใช้สตรีม SSE ใน React ด้วย EventSource” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม

ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเปรียบเทียบ SSE กับ WebSockets และการสำรวจเป็นระยะ
  2. การใช้สตรีม SSE ใน React ด้วย EventSource
  3. รูปแบบการสำรวจแบบต่อเนื่องและตรรกะการเชื่อมต่อใหม่
  4. สร้างฟีดการแจ้งเตือนแบบเรียลไทม์
← กลับไปที่ React Academy