---
# System prepended metadata

title: Day 10 - 拆分 Model
tags: [2024 Node.js直播班]

---

# Day 10 - 拆分 Model
###### 2024 Node.js 每日任務 (此份為我的作答)

因專案會使用到的資料不只有一個 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=
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("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);
```