# 🏅 Day 10 - 拆分 Model 因專案會使用到的資料不只有一個 Collection,像是最後會完成的貼文動態牆,會使用到貼文及使用者等等資料,所有資料的 Model、Schema 都集中在 server.js,可能會造成維護、管理不易 因此可以嘗試將不同資料的 Model 拆分出來,再引入至 `server.js` 做使用 ### 拆分步驟 - 在專案中建立 models 資料夾 - 分別依 Collection 建立檔案,如:`posts.js`、`users.js`...等等 - 因 Schema、Model 建立都需要 Mongoose 套件,因此需記得分別在 `posts.js`、`users.js` 引入 Mongoose 套件 - 將 Schema、Model 拆出來 `models/user.js`: ```javascript const userSchema = new mongoose.Schema( ... ); const User = mongoose.model('User', userSchema); module.exports = User; ``` - 接著引入 models 資料夾中的 Model 到 server.js,即可直接針對 Model 操作新增、查詢、修改、刪除資料 `server.js` ``` // 引入 Model const User = require('./models/user'); ``` 註:引入 Model 時通常變數會使用大寫開頭,例如 Post、User,即可使用 `User.create(...)` 等方式直接針對 User 操作 ### 參考資源 - 課程影音「model export 模組化」 題目 --- 以下為 server.js 內的程式碼,請嘗試依照上方步驟將 server.js 內 Room 的 Schema、Model 拆分至 `models/room.js` 內 ::: spoiler server.js(點擊三角形展開) ```javascript= const http = require("http"); const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/test') .then(()=>{ console.log('資料庫連線成功') }) .catch((error)=>{ console.log(error); }); // Room const roomSchema = new mongoose.Schema({ room: { type: String, required: [true, '房型為必填'] }, price: { type: Number, required: [true, '定價為必填'] }, max: { type: Number, enum: [2, 4, 6], }, bathroom: { type: Boolean, default: false }, amenities: [{ type: String }] }); const Room = mongoose.model('roomCollection', roomSchema); Room.create({ room: '單人房', price: 1800, max: 2, bathroom: true, amenities: ['洗髮精', '沐浴乳', '牙刷'] }) const requestListener = (req, res) => { console.log(req.url); res.end(); } const server = http.createServer(requestListener); server.listen(3005); ``` ::: <br> 將上述程式碼拆分成下方檔案結構: ``` server.js models/ |- room.js ``` models/room.js: ```javascript ... ``` server.js: ```javascript ... ``` ## 回報流程 將答案寫在 CodePen 並複製 CodePen 連結貼至底下回報就算完成了喔! 解答位置請參考下圖(需打開程式碼的部分觀看) ![](https://i.imgur.com/vftL5i0.png) <!-- 解答: models/room.js: ```javascript= const mongoose = require('mongoose'); const roomSchema = new mongoose.Schema({ room: { type: String, required: [true, '房型為必填'] }, price: { type: Number, required: [true, '定價為必填'] }, max: { type: Number, enum: [2, 4, 6], }, bathroom: { type: Boolean, default: false }, amenities: [{ type: String }] }); const Room = mongoose.model('roomCollection', roomSchema); module.exports = Room; ``` server.js: ```javascript= const http = require("http"); const mongoose = require('mongoose'); const Room = require('./models/room'); mongoose.connect('mongodb://localhost:27017/test') .then(()=>{ console.log('資料庫連線成功') }) .catch((error)=>{ console.log(error); }); Room.create({ room: '單人房', price: 1800, max: 2, bathroom: true, amenities: ['洗髮精', '沐浴乳', '牙刷'] }) const requestListener = (req, res) => { console.log(req.url); res.end(); } const server = http.createServer(requestListener); server.listen(3005); ``` --> 回報區 --- <!-- 將答案貼至下方表格內,格式: | Discord 暱稱 | [CodePen](連結) | --> | Discord | CodePen / 答案 | |:-------------:|:-----------------:| | xxx | [CodePen]() | | 苡安 | [hackmd](https://hackmd.io/@L7K9-66lSeagS28AP0_GjQ/H1Crgj2xR) | | shuantt | [CodePen](https://codepen.io/th-tseng/pen/BaEOvwM)| | 阿旭 | [CodePen](https://codepen.io/koei-lu/pen/WNWgPbr)| | Benson | [CodePen](https://codepen.io/nosneb83/pen/LYvJqma)| | Otis | [CodePen](https://codepen.io/humming74/pen/zYXJeaL?editors=0010)| | Chia Pin | [CodePen](https://codepen.io/joker-cat/pen/LYvJqgv)| | jenny7532 | [CodePen](https://codepen.io/wei-chen-wu/pen/abxaXMX)| | wei | [CodePen](https://hackmd.io/@xu7yoa5cSsqaron7h9XhUw/BkNMt0heA)| | Jean | [HackMD](https://hackmd.io/MMHoJNseR2ai_iWAyOSPow?view) | | 2魚 | [CodePen](https://codepen.io/ijrekmsn-the-sans/pen/zYXJXOv) | Fabio20 | [CodePen](https://codepen.io/fabio7621/pen/poBOBvX?editors=0010) | Aida | [CodePen](https://codepen.io/ada23410/pen/QWPVPVW?editors=0010) | | 羽 | [CodePen](https://codepen.io/lingling-Syu/pen/zYXJgpo?editors=0010) | | mei | [CodePen](https://codepen.io/l_umei/pen/abxRorX) | | Lobinda | [CodePen](https://codepen.io/Lobinda/pen/oNOaNgv) | |cho|[CodePen](https://codepen.io/cho195/pen/QWPZWGQ) | ej_chuang | [CodePen](https://codepen.io/EJChuang/pen/NWmOqOd) | | tung030374 | [CodePen](https://codepen.io/tung__u/pen/WNWavBO) | | william_hsu | [CodePen](https://codepen.io/william8815/pen/yLrRNdv) | | kelvinnn | [CodePen](https://codepen.io/is-lin/pen/rNbqOdg?editors=0010) | | runweiting | [CodePen](https://codepen.io/weiting14/pen/BaEqRgL) | | Theodore | [CodePen](https://codepen.io/GustavoFringgg/pen/YzMJydZ?editors=0010) | | Hank | [CodePen](https://codepen.io/tw1720/pen/XWQxLrY) | | Hank | [CodePen](https://codepen.io/tw1720/pen/XWQxLrY) | | ellallu0903 | [CodePen](https://codepen.io/ellallu0903/pen/QWPJWgO) | | Thomas | [CodePen](https://codepen.io/ThomasYeh/pen/vYMQXap) | | william威良 | [CodePen](https://codepen.io/snowman12320/pen/KKYrrxo?editors=1010) | | Tiya | [CodePen](https://codepen.io/Tiya_blank/pen/OJGadve) | | Ciel | [CodePen](https://codepen.io/nycteachen/pen/JjVeVoj) | | Fabio20 | [CodePen](https://codepen.io/fabio7621/pen/ZEZVpYm) | | 瑀君 | [CodePen](https://codepen.io/yennnnn/pen/zYXyNVb)| | yoshidc | [CodePen](https://codepen.io/yoshiyyc/pen/xxemLxo)|