ทำความรู้จักและใช้งาน Mongoose Middleware (Node.js)
หลังจากที่ในบทความที่แล้วผมได้เกริ่นไว้ว่าเราจะมาเขียน 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 ได้เลยครับ