Nuxt.js Fundamental ตอนที่ 10 - การทำ Internal API และ Middleware
เนื้อหาของบทเรียน Nuxt.js
- ตอนที่ 1 - Getting Started with Nuxt.js
- ตอนที่ 2 - สร้าง Nuxt.js ด้วย create-nuxt-app
- ตอนที่ 3 - การกำหนด Routing
- ตอนที่ 4 - Nuxt.js Concept
- ตอนที่ 5 - Nuxt Content และ Async Data
- ตอนที่ 6 - การดึงข้อมูลจาก APIs
- ตอนที่ 7 - การใช้งานร่วมกับ Vuex Store
- ตอนที่ 8 - ทำระบบ Authentication ด้วย Nuxt.js
- ตอนที่ 9 - การ Deploy Nuxt.js
- ตอนที่ 10 - การทำ Internal API และ Middleware
- ตอนที่ 11 - ทำ SEO และ Meta tags
- ตอนที่ 12 - Workshop
ต่อมาขอเสริมเรื่องการทำ Internal API กันซักนิด ต่อยอดจาก ตอนที่ 8 - ทำระบบ Authentication
จากตอนก่อนหน้านี้ ผมใช้ API ที่อยู่อีก Server นึง ทีนี้ ถ้าตัว Nuxt.js อยากให้ API อยู่ที่เดียวกันกับตัว Nuxt Page ปกติเลย ทำได้มั้ย?
คำตอบคือทำได้ครับ
serverMiddleware
ตัว serverMiddleware ทำให้เราสามารถกำหนด API ได้เอง และส่วน API ก็สามารถเขียนได้แบบ style ของ Express.js เลยครับ
ตัวอย่างเช่นไฟล์ nuxt.config.js
- เราแค่ระบุเป็น Object
path
และhandler
function ในserverMiddleware
- ส่วนไฟล์
handler
ก็สามารถไว้ที่โฟลเดอร์api
(สร้างใหม่ หรือใช้ชื่ออื่นๆ ก็ได้)
ทีนี้ เราก็มาสร้างโฟลเดอร์ api
ไว้ที่ level เดียวกับ pages
หรือ components
โดยข้างในมีไฟล์ index.js
ครับ
ติดตั้ง
express
ด้วยnpm install express
ก่อนนะ ถ้าใครรันไม่ได้
ทีนี้ พอเรากำหนด แบบนี้ เราก็สามารถเข้าถึง http://localhost:3000/api/hello ก็จะแสดงผล {message: 'Hello from serverMiddleware'}
ครับ
เพราะเรากำหนดใน serverMiddleware
ว่า path
คือ /api
และในไฟล์ api/idnex.js
เรากำหนด app.get('/hello')
ฉะนั้น path มันก็จะต่อกันเป็น /api/hello
เหมือนกับเราใช้ Express แบบนี้
สร้างไฟล์ api/auth.js
ทีนี้มาดูการใช้งานจริง ผมก็อปไฟล์ server.js
จากตอนที่ 8 มาดังนี้
จากนั้น ผมทำการปรับแก้ บางส่วน คือ
จากโค๊ดจะเห็นว่า ผมใช้เป็น
- เพราะ
serverMiddleware
กำหนดให้ Object เป็นpath
กับ functoinhandler
- และเอา
app.use('/api', router)
ออก เนื่องจากเรากำหนดในpath: '/api'
แทน ก็เลยเหลือแค่app.use(router)
app.listen
ก็ไม่ต้องใช้แล้วครับ เพราะเราไม่ได้ start server แยก
สุดท้ายไฟล์ api/auth.js
ก็จะได้แบบนี้
ต่อมาที่ไฟล์ nuxt.config.js
ก็ปรับแก้ serverMiddleware
อีกนิด เป็นแบบนี้
เราสามารถกำหนด
serverMiddleware
เป็น string ก็ได้ หรือ Object ก็ได้ (ถ้าเป็น string ก็ต้องเป็นไฟล์ที่เรามี Objectpath
และhandler
นั่นเอง ไม่งงเนอะ)
ทีนี้ เราก็สามารถใช้ API ได้แบบเดียวกันกับตอนที่ 8 ได้เลย โดยที่ไม่ต้อง Start server แยก ที่ port 12345 แล้ว ก็ใช้ port เดียวกันกับเว็บปกติเลยคือ 3000
ทดลองเข้า http://localhost:3000/api/me แล้วดูผลลัพธ์
Middleware
ทีนี้มาดูเรื่องของ Middlware กันบ้างครับ จริงๆ ในตอนที่ 8 เราจะเห็นว่ามีการกำหนด Middleware ในหน้า Page เช่น
จริงๆแล้ว Middlware มันก็คือ function นี่แหละครับ ที่จะรันก่อน page มัน render เราสามารถสร้าง middlware แบบ global แชร์กันได้ โดยสร้างไว้ในโฟลเดอร์ middlware
นั่นเอง
ตัวอย่าง middlware function (args ตัวแรกที่ถูกส่งไปคือ context
) เราสามารถเข้าถึงค่า context
ได้ เช่น handle ว่าเป็น server หรือ client หรือ get params เป็นต้น
เช่น ผมสร้าง middlware/logger.js
ขึ้นมา
ทีนี้ถ้าอยากใช้ middlware นี้ ก็แค่กำหนดใน page แบบนี้
ชื่อ Middleware ก็ตามชื่อไฟล์เลย
นอกจากนี้เราก็ยังสามารถสร้าง Middlware แบบ anonymous ใช้แค่ที่เดียวแบบนี้ได้
รายละเอียดเพิ่มเติมเกี่ยวกับ Middleware อ่านได้ที่นี่
Hints & Questions?
- Internal API ถ้าเราทำการ build แบบ
static
และเป็น modespa
มันจะรันได้มั้ย? - ลองใช้ Internal API ร่วมกับ connect ดูครับ
serverMiddleware
กับmiddleware
ใน Page เหมือนกันมั้ย?
อ่านบทถัดไป 👉 ตอนที่ 11 - ทำ SEO และ Meta tags
- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust