สถาปัตยกรรมทางเทคนิค
ลำดับการทำงานฝั่งเซิร์ฟเวอร์ตั้งแต่การเรียกฟีด การแปลงข้อมูล จนถึงการส่งค่าให้หน้าเว็บ อ้างอิงจาก src/lib/gold.ts และ src/routes/index.tsx โดยตรง
ภาพรวม // Overview
แกนหลักคือ server function getGoldData (สร้างด้วย createServerFn ของ TanStack Start) ทำงานฝั่งเซิร์ฟเวอร์เสมอ แม้จะถูกเรียกจากไคลเอนต์ก็จะกลายเป็น RPC ไปรันบนเซิร์ฟเวอร์ ดังนั้น เบราว์เซอร์ไม่เคยเรียกฟีดต้นทางตรง ๆ จึงเลี่ยงปัญหา CORS
ลำดับการดึงข้อมูล // Server-side fetch flow
- 1
เรียกฟีดต้นทาง
fetch(FEED_URL)ไปที่thaigold.info/RealTimeDataV2/gtdata_.txtพร้อมAbortSignal.timeout(9000)(ตัดที่ 9 วินาที) และ ส่ง headerAccept: application/json, text/plain, */* - 2
ตรวจสถานะ HTTP
ถ้าres.okเป็น false จะ throw`feed ${res.status}`เพื่อตกไปที่ตัวจัดการ ข้อผิดพลาด - 3
อ่านและ parse
อ่าน body เป็นข้อความด้วยres.text()แล้วJSON.parseเป็น array และตรวจว่าเป็น array จริง (ไม่ใช่ก็ throwbad feed shape) - 4
แปลงเป็นโครงสร้างของแอป
parseFeedสร้างMapตามชื่อแถว แล้วดึงสมาคมฯ,96.5%,GoldSpot,THBและUpdateออกมาเป็นQuoteแต่ละก้อน (bid / ask / diff) - 5
คืนค่า GoldData
คืนอ็อบเจกต์GoldDataพร้อมupdatedAt(จาก unix seconds ในแถว Update) และธงokที่เป็น true เมื่อมีราคาทองอย่างน้อยหนึ่งค่า
การจัดการข้อผิดพลาดและ fallback
ทั้งบล็อกอยู่ใน try/catch ก้อนเดียว ถ้าขั้นตอนใดล้มเหลว (เครือข่าย, timeout, HTTP ไม่ใช่ 2xx, JSON เพี้ยน) ตัว catch จะคืน GoldData ที่ทุก quote เป็น null และ ok:false แทนการโยน error ออกไป หน้าเว็บจึงไม่พังและแสดง สถานะ OFFLINE แทน
catch {
return {
goldBar: { bid: null, ask: null, diff: null },
goldJewelry: { bid: null, ask: null, diff: null },
spot: { bid: null, ask: null, diff: null },
thb: { bid: null, ask: null, diff: null },
updatedAt: Date.now(),
ok: false,
};
}ฝั่งหน้าเว็บ (src/routes/index.tsx) จะอัปเดตสเตตเฉพาะเมื่อ next.ok เป็น true เท่านั้น ถ้ารีเฟรชรอบใดดึงไม่สำเร็จ จะคง ราคาล่าสุดที่ดีไว้ ไม่เขียนทับด้วยค่าว่าง นี่คือกลไก fallback ฝั่ง client ที่ทำงานคู่กับ fallback ฝั่ง server ข้างบน
การประมวลผลฝั่ง backend // Processing
การประมวลผลทั้งหมดเบาและ synchronous หลัง parse: จับคู่แถวด้วยชื่อ, ทำความสะอาดตัวเลขด้วย toNum (ตัด + จุลภาคและ ช่องว่าง) แล้วแปลง unix timestamp เป็นมิลลิวินาที ไม่มีการเขียนลง ฐานข้อมูล ไม่มี job เบื้องหลัง และไม่มีการแคชฝั่งเซิร์ฟเวอร์ - แต่ละ คำขอคือการดึงสด