ชื่อเรื่องนี้เป็นข้อเสนอเพราะโดยค่าเริ่มต้นแต่ละโมดูลในแอปพลิเคชัน Node.js จะถูกแชร์กับการเชื่อมต่อฐานข้อมูลเดียวกัน แต่ถ้าท่าทางผิดอาจน่าเกลียดและอาจผิดพลาด
คุณสามารถเพิกเฉยต่อส่วนต่อไปนี้และไปถึงจุด
พื้นหลัง
เมื่อเร็ว ๆ นี้ฉันกำลังออกแบบหลักสูตรระดับมืออาชีพชื่อเรื่องคือ "ระบบการจัดการการจองตั๋วอากาศ" ข้อกำหนดนั้นค่อนข้างง่ายดังนั้นฉันจึงพยายามใช้ Node.js ที่ฉันเรียนรู้เมื่อเร็ว ๆ นี้ ฉันยังตรวจสอบว่าเฟรมเวิร์ก Node.js ประเภทใดที่เหมาะสมกว่า หลังจากอ่านกรอบสองสามเฟรมฉันพบว่านี่เป็นฆาตกร หากคุณมีเวลาอ่านเอกสารและข้อมูลการค้นหาจะเป็นการดีกว่าที่จะเขียนโดยตรง ในที่สุดหลังจากเขียนฉันจะใส่รหัสบน GitHub ทุกคนยินดีที่จะวิพากษ์วิจารณ์และแก้ไขฉัน
ในแง่ของฐานข้อมูลฉันคิดว่าฉันคุ้นเคยและชอบ JSON มากขึ้น (ฉันยอมรับมันถ้าฉันไม่ได้เรียนรู้ SQL ที่ดี -_-#) ดังนั้นฉันจึงเลือก MongoDB Node + Mongo เป็นการรวมกันของแบ็กเอนด์ที่ได้รับความนิยมมากขึ้นในช่วงไม่กี่ปีที่ผ่านมาและมีข้อมูลมากมายเกี่ยวกับวิธีการใช้ร่วมกันบนอินเทอร์เน็ต แต่เพื่อประหยัดเวลา (การออกแบบหลักสูตรเป็นเวลาเพียงหนึ่งสัปดาห์) และมุ่งเน้นไปที่ระบบและตรรกะมากขึ้นฉันใช้ Mongoose ซึ่งเป็นส่วนขยายของ node.js ที่ใช้เป็นพิเศษสำหรับการสร้างแบบจำลองข้อมูล MongoDB เพื่อลดรหัสที่ใช้งานฐานข้อมูลอย่างมาก
หัวข้อหลัก
ฉันได้สร้างแบบจำลองข้อมูลสองแบบหนึ่งคือผู้ใช้ (ผู้ใช้) และอีกรุ่นคือเที่ยวบิน (เที่ยวบิน) ซึ่งถูกห่อหุ้มไว้ในโมดูลสองโมดูล (โมดูล) ของผู้ใช้ uss.js, flight.js โมเดลมีความรับผิดชอบโดยเฉพาะในการโต้ตอบกับฐานข้อมูล ทั้งโมดูลผู้ใช้และเที่ยวบินจำเป็นต้องเชื่อมต่อกับฐานข้อมูล ในตอนแรกรหัสของฉันมีดังนี้:
// ------ user.js ------ // ต้องการ mongoose.js อ้างอิง mongoose.jsvar m = ต้องการ ('mongoose'); // เชื่อมต่อกับฐานข้อมูลเชื่อมต่อกับฐานข้อมูล m.connect ('mongoDb: // localhost/test'); // ... ต้องการ ('mongoose'); // เชื่อมต่อกับฐานข้อมูลเชื่อมต่อกับฐานข้อมูล m.connect ('mongoDb: // localhost/test'); // ... รหัสอื่น ๆ ... // ------ models.js ----- ผู้ใช้ var = ต้องการ ('./ผู้ใช้'), เที่ยวบิน = ต้องการ ('./เที่ยวบิน');ไม่ต้องพูดถึงว่าวิธีการเขียนนี้ไม่แห้งเลยวิธีการนี้เองนั้นผิด เมื่อฉันเรียกใช้ index.js ฉันได้รับข้อผิดพลาดต่อไปนี้
> node index.js> ข้อผิดพลาดการเชื่อมต่อ: {[ข้อผิดพลาด: พยายามที่จะเปิดการเชื่อมต่อที่ยังไม่ได้รับ] state: 2}ข้อผิดพลาดคือ: พยายามเปิดการเชื่อมต่อที่ไม่ได้เปิด
ดังนั้นเราควรเชื่อมต่อกับฐานข้อมูลหนึ่งครั้งในที่เดียวจากนั้นโมดูลอื่น ๆ ที่จำเป็นต้องเชื่อมต่อกับฐานข้อมูลโต้ตอบกับฐานข้อมูลผ่านโมดูลนี้ มันเป็นเหมือนกระดานสายไฟและเขาตะโกนโดยไม่ลังเล: "มีซ็อกเก็ตเดียวบนผนังอย่าปล้นมัน! ปล่อยฉันไป! คุณ ... ไม่เป็นไร!"
แผนเฉพาะ
เราใส่การเชื่อมต่อกับฐานข้อมูลลงในโมดูลและเปิดเผยการเชื่อมต่อกับโมดูลอื่น ๆ ในแอปพลิเคชันทั้งหมดและจากนั้นโมดูลอื่น ๆ ที่จำเป็นต้องเชื่อมต่อกับฐานข้อมูลสามารถอ้างถึงการเชื่อมต่อนี้
// ----- database.js ----- var m = ต้องการ ('mongoose'); m.connect ('mongoDb: // localhost/test'); // อ้างอิงไปยังการเชื่อมต่อฐานข้อมูลสร้างการอ้างอิงสำหรับการเชื่อมต่อนี้ var db = m.connection; ----- user.js ------ flight.js ที่คล้ายกัน -----/... รหัสอื่น ๆ ... // เราจะผ่านการอ้างอิงของการเชื่อมต่อฐานข้อมูลเป็นพารามิเตอร์ในโมเดลโมดูล js. exports = ฟังก์ชั่น (db) {ถ้า (db) {// ... ดึงข้อมูลอ้างอิงไปยังการเชื่อมต่อฐานข้อมูลอ้างอิงจากการเชื่อมต่อฐานข้อมูล var db = ต้องการ ('./ ฐานข้อมูล'); // ส่งการอ้างอิงไปยังการเชื่อมต่อฐานข้อมูลลงในโมดูลที่ต้องเชื่อมต่อกับฐานข้อมูลและงานเสร็จสมบูรณ์! var user = ต้องการ ('./ ผู้ใช้') (db), เที่ยวบิน = ต้องการ ('./ เที่ยวบิน') (db);นี่เป็นวิธีหนึ่งที่จะได้รับหลายโมดูลของแอปพลิเคชัน Node.js เพื่อแชร์การเชื่อมต่อฐานข้อมูล ฉันเห็นมันบน stackoverflow หากคุณมีวิธีที่ดีกว่าโปรดแบ่งปันกับคุณในความคิดเห็น!