# 🏅 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 連結貼至底下回報就算完成了喔!
解答位置請參考下圖(需打開程式碼的部分觀看)

<!-- 解答:
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)|
| puffy_chen | [CodePen](https://codepen.io/TernMayDay/pen/wvbMWKN?editors=1010)|