--- tags: Node.js 直播班 - 2023 春季班 --- # 🏅 Day 38 - 追蹤/取消追蹤使用者功能 **執行流程:** A 使用者對其他使用者(如 B) 點擊追蹤時,會分別在 A 使用者的 user 資料 followings 欄位加入 B 的 ID,B 使用者的 user 資料 followers 欄位也會加入 A 的 ID 若執行取消追蹤則從 A 使用者的 user 資料 followings 欄位、B 使用者的 user 資料 followers 欄位移除 ID **實作前準備** 需先於 user Model 中加入 followers 與 follwing 欄位,預計會加入使用者 ID 及加入時間([參考](https://github.com/gonsakon/express-week4-sample/blob/week8/models/usersModel.js#L29-L46)) `由於社群網站在設計上會限制 500 位會員數,預計在兩個欄位中分別加入 499 個 user ID 不會超過 MongoDB Document 的 16mb 容量限制,因此可使用直接將 ID 加入 user 資料的方式執行` ```javascript followers: [ { user: { type: mongoose.Schema.ObjectId, ref: 'User' }, createdAt: { type: Date, default: Date.now } } ], following: [ { user: { type: mongoose.Schema.ObjectId, ref: 'User' }, createdAt: { type: Date, default: Date.now } } ] ``` ## 題目 **實作使用者追蹤、取消追蹤功能** 可參考第八週[範例程式碼](https://github.com/gonsakon/express-week4-sample) - 設計追蹤路由 POST`users/:id/follow`、取消追蹤路由 DELETE `users/:id/unfollow` - 需登入通過 JWT 驗證才能請求 - 不能追蹤或取消追蹤帳號本人 - 追蹤與取消追蹤都需調整追蹤者與被追蹤者雙方的 user 資料 - 使用 updateOne() 搭配 `$addToSet` `$pull` 將使用者 ID 加入或移除 - 準備好兩個已註冊過的帳號,測試可以正確互相追蹤以及取消追蹤 ## 回報流程 將答案連結貼至底下回報就算完成了喔! 解答位置請參考下圖(需打開程式碼的部分觀看) ![](https://i.imgur.com/vftL5i0.png) <!-- 解答: models/usersModel.js https://github.com/gonsakon/express-week4-sample/blob/week8/models/usersModel.js#L29-L46 routes/users.js 參考 https://github.com/gonsakon/express-week4-sample/blob/week8/routes/users.js#L90-L144 ```javascript router.post('/:id/follow',isAuth, handleErrorAsync(async(req, res, next) =>{ if (req.params.id === req.user.id) { return next(appError(401,'您無法追蹤自己',next)); } await User.updateOne( { _id: req.user.id, 'following.user': { $ne: req.params.id } }, { $addToSet: { following: { user: req.params.id } } } ); await User.updateOne( { _id: req.params.id, 'followers.user': { $ne: req.user.id } }, { $addToSet: { followers: { user: req.user.id } } } ); res.status(200).json({ status: 'success', message: '您已成功追蹤!' }); })) router.delete('/:id/unfollow',isAuth, handleErrorAsync(async(req, res, next) =>{ if (req.params.id === req.user.id) { return next(appError(401,'您無法取消追蹤自己',next)); } await User.updateOne( { _id: req.user.id }, { $pull: { following: { user: req.params.id } } } ); await User.updateOne( { _id: req.params.id }, { $pull: { followers: { user: req.user.id } } } ); res.status(200).json({ status: 'success', message: '您已成功取消追蹤!' }); })) ``` --> 回報區 --- | 報數 | 組別/Discord 名字 | Codepen/HackMD/其他回饋 | |:----:|:-----------------------:|:-------------------------------------------------------------------------:| | 1 | 中 4 組 / jimkk159 | [HackMD - Day 38](https://hackmd.io/Yj0IvHOySxiy6J_8Lo_ajA) |