มาเขียน Middleware ของตัวเองกันดีกว่า (Express + Node.js)

--

Photo by Luca Bravo on Unsplash

Middleware คืออะไร ?

Middleware หรือ Middleware function คือ ฟังก์ชั่นที่สามารถเข้าถึง request object (req), response object (res) และ next function ของ request ที่ client นั้นส่งเข้ามาที่ application ของเรา ส่วน next นั้นจะเป็นฟังก์ชั่นของ Express router โดยเมื่อฟังก์ชั่นนี้ถูกเรียกใช้งานสามารถหมายความได้ว่าฟังก์ชั่นปัจจุบันนั้นถูก execute และทำงานเสร็จเรียบร้อยแล้ว จากนั้นระบบจะไปทำงาน middleware ตัวถัดไป (ถ้ามี)

var express = require('express');
var app = express();

app.get('/', function (req, res, next) {
next();
})

app.listen(3000)

จากโค้ดด้านบน จะสามารถอธิบายได้ดังนี้

  1. app.get() โดย GET คือ HTTP Method ที่ใช้งาน middleware ฟังก์ชั่นนั้นอยู่
  2. get(“/”, function ) โดย “/” คือ Path(route) ที่ใช้งาน middleware
  3. function ซึ่งก็คือ middleware ฟังก์ชั่นที่เราใช้งานกันเป็นปกตินั่นเองครับ
  4. req, res, next คือ HTTP Request, Response และ callback ของ next ตามลำดับ

ตัวอย่าง Middleware

สร้าง server อย่างง่ายขึ้นมาหนึ่งอัน

สร้าง middleware function ที่มีชื่อว่า myLogger ขึ้นมา ซึ่งจะทำการ console คำว่า “LOGGED” ทุกครั้งที่มี Request เข้ามา

ต่อไปให้เรียกใช้ middleware function ด้วยคำสั่ง use(“functionName”) โดยเมื่อรวมกันแล้วจะได้ดังนี้

จากนั้นผมจะทำการทดลองยิงเข้าไปที่ api ของเรา จากนั้นจะมี log ขึ้นมาดังนี้

ซึ่งถ้าหากสังเกตุจะเห็นได้ว่า path get(“/”) นั้นจริง ๆ ก็คือ middleware ตัวนึงที่จะทำงานก็ต่อเมื่อมี HTTP Request GET มาด้วย endpoint “/” นั่นเองครับ

ทำให้เราสามารถเพิ่ม middleware แบบไปที่แค่บาง endpoint หรือหนึ่ง endpoint สามารถใช้หลาย middleware ได้ ดังตัวอย่างข้างล่างนี้

มาเขียน Middleware สำหรับเช็คสิทธิ์ของ user กัน

อันดับแรกให้ไปที่ไฟล์ models/user.js เพื่อเพิ่มฟิลด์ที่มีชื่อว่า role โดยเก็บเป็น String และมีค่าเริ่มต้นอยุ่ที่ user

role: {
type: String,
enum: ["user", "admin", "super_admin"],
default: "user"
}

ต่อมาให้เราทำการเพิ่มไฟล์ index.js ไปที่ src/plugins/permission ดังนี้

โดยจะเป็นฟังก์ชั่นที่รับค่าสิทธิ์เข้ามาในรูปแบบอาเรย์ของสตริง และทำการ return กลับไปในรูปแบบฟังก์ชั่น โดยถ้า user ที่ทำการ request เข้ามานั้นมีสิทธิ์ตามที่เราได้ระบุไว้ในตอนเรียกใช้ middleware ก็จะสามารถผ่านไปได้ แต่ถ้าหากไม่มีสิทธิ์ก็จะได้รับ response ที่มี status 403 และข้อความว่า “Forbidden” นั่นเองครับ

จากนั้นให้เราทำการสร้างไฟล์ไปที่โฟลเดอร์ src/routes/secure_route/user ด้วยชื่อ user.js และเรียกใช้ middleware permission เพื่อทดสอบดังนี้ (อย่าลืม import และเรียกใช้ในไฟล์ secure_routes/index.js ด้วย path(“/users”))

ทดสอบ middleware ของเราว่าใช้งานได้ถูกต้อง

โดยผมได้ทำการสร้าง user ที่มีสิทธิ์ admin ขึ้นมา 1 account และสิทธิ์ user ก็คือ test01 ที่เราได้สร้างขึ้นมาใน ep ก่อน ๆ นั่นเองครับ

โดยผมจะทำการเรียกเข้าไปที่ api/auth/users ด้วย HTTP method GET ด้วยสิทธิ์ admin และ user ตามลำดับ

เรียกใช้ด้วยสิทธิ์ “admin”

เรียกใช้ด้วยสิทธิ์ “user”

ก็จบไปแล้วนะครับสำหรับบทความเขียน middleware ด้วยตัวเอง ซึ่งผู้อ่านสามารถนำไปประยุกต์ใช้กับระบบได้ตามสถานการณ์ต่าง ๆ ได้เลยครับ และถ้าหากผู้อ่านท่านใดสนใจสามารถไปอ่านเพิ่มเติมได้ที่ express ได้เลยครับ

ในส่วนสุดท้ายนี้ก็เช่นเคยครับ สำหรับผู้อ่านที่อยากดู source code สามารถตามไปดูได้ที่ github ได้เลยครับ สวัสดีครับ

--

--