งานของ Data Engineer ไม่ได้มีแค่นำข้อมูลเข้ามา และดูแลจัดเก็บรักษาเท่านั้นฮะ แต่ยังต้องเตรียมส่งออกไปให้ลูกค้าด้วย ซึ่งมีครั้งนึงที่ต้องให้ลูกค้าที่เป็น developer ด้วยกันเข้ามาใช้งาน และนี่จึงเป็นการออกแบบระบบ API ให้พวกเขาได้ข้อมูลไปฮะ

ด้วยความที่ทีมผมเองไม่ได้แน่นวิชาการ programming สู้พวก developer ไม่ได้ ดังนั้น ทางออกของเราคือ “ได้ API โดยที่เขียนโค้ดให้น้อยที่สุด” เพื่อให้ได้ outcome ที่เร็วที่สุด แน่นอนว่าเราต้องอาศัย tools ข้างนอกแหละฮะ

และเราก็ได้รู้จักกับสิ่งนี้

Credit: https://loopback.io

Loopback เป็น framework ที่พัฒนาด้วยภาษา NodeJS ที่ใช้ทำ API endpoint ซึ่งตอนนี้ก็เป็น version 4 แล้ว มีความสามารถอะไรมากขึ้น และทำงานง่ายขึ้น ง่ายแค่ไหน ไปลองกันฮะ

1. ใช้ Docker เป็นฐาน

เอะอะก็ Docker ก่อนเลยฮะ เพราะมันใช้ง่าย ลบง่ายฮะ

docker pull node:14-alpine3.10
docker run -it -d -p 3000:3000 – name node_lb node:14-alpine3.10 node
docker exec -it node_lb /bin/sh

เรา pull image node:14-alpine3.10 มา เพราะ Loopback version 4 รองรับถึง Node version 14 ฮะ ใหม่กว่านั้นยังไม่รองรับนะฮะ

จากนั้นก็ run -it พร้อมเปิด port 3000 ที่ Loopback จะใช้งาน สร้างเป็น container ชื่อ “node_lb” นะฮะ ส่วนคำว่า node หลังสุด ก็เพื่อให้มันรันคำสั่งเริ่มต้นนั่นเองฮะ

สุดท้ายเราก็ exec -it เข้าไปข้างในเพื่อติดตั้ง Loopback package กันฮะ

2. ติดตั้ง Loopback

อ้างอิงจาก official doc ของ Loopback (https://loopback.io/doc/en/lb4/Getting-started.html) เราติดตั้ง Loopback package กันง่ายๆ เลยตามนี้ฮะ

npm i -g @loopback/cli
lb4 app

เราจะต้องกรอกข้อมูลของ app ที่เราจะสร้างไป ตรงนี้ ผมใส่เป็น “test” แล้วเลือกทุกอย่างหลังจากนั้นเป็นค่าเริ่มต้น เราจะได้ folder “/test” มาฮะ

cd test
npm start

เข้าไปใน folder ใหม่นั้น แล้วใช้ npm start เพื่อเริ่มรันฮะ

เนี่ย เสร็จละ ลองเข้าไปที่ http://localhost:3000 เราก็จะได้หน้านี้

เข้าไปต่อที่ “/explorer” เราจะเห็นหน้านี้เป็น Swagger หรือหน้าสารบัญ API ให้เราลองเรียกดูได้เลย

3. ต่อ Database ใส่เพิ่มเข้าไป

บล็อกนี้ไม่จบแค่นี้หรอกนะ เราต้องเล่นต่ออีกหน่อยนึง

สมมติว่า เรามีข้อมูลตามรูปนี้อยู่ในถัง MySQL ที่ database ชื่อ “test” ในตาราง “test_students”

เราอยากให้ Loopback สามารถเข้าไปเชื่อมกับ MySQL ออกมาเป็น API ก็ทำตามนี้ได้เลยเป็นตัวอย่างฮะ

3.1 สร้าง datasource

ใช้คำสั่ง lb4 datasource มันจะขึ้นให้เรากรอกว่า จะเลือกต่อกับ Database อะไร อย่างไร อันนี้ผมก็เลือกเป็น MySQL ตามตัวอย่างฮะ

3.2 สร้าง model

ต่อมา เราก็ต้องสร้าง model เพื่อให้มันรู้จักว่า data object จะมีหน้าตาเป็นยังไง ด้วยคำสั่งนี้ฮะ lb4 model

อ้อ ถ้า object มี ID กำกับ ให้เลือก model base class เป็น “Entity” นะฮะ ไม่งั้นมันจะเกิด error ตอนหลังได้

จากรูปข้างล่าง เราก็จะมี “id” เป็น number และ “name” เป็น string ตรงกับตาราง MySQL ที่เราเตรียมไว้ตอนแรก แล้วเราก็ได้ model ชื่อ “TestStudents” มาครอบครอง

3.3 สร้าง Repository

Repository เป็นตัวเชื่อมระหว่าง datasource กับ model ให้ Loopback มันรู้ว่า เราจะเชื่อมต่อ datasource นี้ด้วย object แบบไหน เราใช้คำสั่ง lb4 repository แล้วเลือกค่าที่เราต้องการ เสร็จละ

3.4 สร้าง Controller

เมื่อสร้าง Repository แล้ว ขั้นสุดท้ายคือการสร้าง controller ด้วยคำสั่ง lb4 controller โดย controller คือ API จริงๆ ที่จัดการข้อมูล เช่น ดึงออกมาแสดงผล หรือนำไปบันทึกใน database

เพื่อความรวดเร็ว เราเลยสร้าง controller แบบ “REST Controller with CRUD functions”

3.5 กดรันเลย

เสร็จแล้ว เราลอง npm start ไปลองเล่นอีกรอบ จิ้มๆ ดูก็เกิด error นี้ขึ้นมา “ER_NO_SUCH_TABLE” อ้าว

ตรงนี้เกิดจาก datasource ที่เราสร้างตอนแรก มันได้ชื่อเป็น “TestStudents” แต่ตาราง MySQL จริงๆ มันคือ “test_students” เพราะ Loopback จัดการชื่อตัวแปรไว้แบบนี้ เราแก้ไขด้วยการเพิ่ม attribute “name” เป็นชื่อตารางที่ถูกต้อง ในไฟล์ model ที่อยู่ที่ “test/src/model/model_name.model.ts” ตามนี้เลยฮะ

@model ({ name: 'real_tablename' })

ให้เครดิตจากกระทู้นี้ฮะ https://stackoverflow.com/questions/52823165/how-can-i-set-the-mysql-table-name-for-a-model-on-loopback-4

คราวนี้ลอง npm start อีกที ผ่านแล้ว ได้ผลลัพท์ตามตาราง MySQL ที่เราต้องการแล้วล่ะ


เป็น tool ที่ใช้งานง่ายมาก แป๊บเดียวเสร็จละ ได้ API พื้นฐานมาแล้ว ที่เหลือก็แล้วแต่เราจะดีไซน์ว่าจะให้มีความซับซ้อน ความปลอดภัยเพิ่มเติมยังไงได้บ้าง ก็เขียน NodeJS function เข้าไปใส่ได้เองฮะ