ทำความรู้จักและใช้งาน Mongoose Middleware (Node.js)

--

Photo by Paul E. Harrer on Unsplash

หลังจากที่ในบทความที่แล้วผมได้เกริ่นไว้ว่าเราจะมาเขียน middleware ให้กับ schema ดังนั้นบทความนี้เราจะมาทำความรู้จักและเขียน middleware เบื้องต้นกันครับ

Middleware คืออะไร ?

Middleware คือฟังก์ชั่นที่เราทำการส่งเข้าไปเพื่อให้ควบคุมหรือจัดการกับข้อมูลทั้งก่อนหรือหลังที่ mongoose นั้นจะทำการจัดการกับ schema นั่นเองครับ (สำหรับในส่วนของ mongoose middleware)

โดย middleware ของ mongoose นั้นจะมีสองแบบคือ pre และ post โดย pre ก็คือก่อนการทำงาน และ post ก็คือหลังจากทำงานแล้วตามชื่อเลยครับ

ประเภทของ mongoose middleware นั้นมี 4 ประเภทด้วยกันคือ document middleware, model middleware, aggregate middleware และ query middleware

การเรียกใช้ middleware

var schema = new Schema(..);
schema.pre('save', function(next) {
// do stuff
next();
});

จากโค้ดด้านบนจะสามารถอธิบายได้ดังนี้ ตัวแปร schema เรียกใช้ฟังก์ชั่น pre และทำการใส่พารามิเตอร์ไป 2 ตัวโดยมีความหมายดังนี้ 1)ชื่อ method 2)ฟังก์ชั่นสำหรับทำงานที่เราต้องการ (NOTE: ตรงนี้ยังไม่รองรับ es6 หรือ arrow function นะครับ)

ตัวอย่างเบื้องต้น

โดยผมจะทำการเรียกใช้ middleware 4 ตัวไว้ในโมเดล book และทำการบันทึกข้อมูลหนังสือใหม่ โดยจะมี middleware ดังนี้ (mongoose มี built-in สำหรับ pre(‘save’) ซึ่งจะเรียก ‘validate’ อยู่ ดังนั้นหมายความว่า pre และ post ของ ‘validate’ จะทำงานก่อน ‘save’ เสมอครับ)

schema.pre('validate', function() {
console.log('this gets printed first');
});
schema.post('validate', function() {
console.log('this gets printed second');
});
schema.pre('save', function() {
console.log('this gets printed third');
});
schema.post('save', function() {
console.log('this gets printed fourth');
});

โดยเมื่อเรียกใช้ api สำหรับสร้างหนังสือ จะมี log ออกมาดังนี้

ทดลองเขียน Middleware สำหรับเพิ่มฟิลด์ให้กับโมเดลหนังสือ

ในบทความนี้ผมจะทำการเขียน middleware สำหรับเพิ่มฟิลด์ createdDate และ updatedDate เพื่อทำการเพิ่ม timestampt ให้กับข้อมูลหนังสือของเราว่าถูกสร้างครั้งแรกเมื่อไหร่ และมีการอัปเดทหรือแก้ไขครั้งสุดท้ายตอนไหนนั่นเองครับ

โดยผมจะแยกออกมาอยู่ในโฟลเดอร์ที่ชื่อ plugins/schema และใช้ชื่อว่า timestamp.js โดยมีตัวอย่างโค้ดดังนี้

จากนั้นผมจะทำการสร้างข้อมูลหนังสืออีกครั้งนึง ซึ่งข้อมูลที่ได้จะมีฟิลด์ข้อมูลเพิ่มขึ้นมาเป็นดังนี้

เปรียบเทียบกับตัวอย่างการสร้างข้อมูลหนังสือจากบทความที่แล้ว

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

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

--

--