การใช้สตรีม 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเปรียบเทียบ SSE กับ WebSockets และการสำรวจเป็นระยะ
- การใช้สตรีม SSE ใน React ด้วย EventSource
- รูปแบบการสำรวจแบบต่อเนื่องและตรรกะการเชื่อมต่อใหม่
- สร้างฟีดการแจ้งเตือนแบบเรียลไทม์