--- tags: Node.js 直播班 - 2023 春季班 --- # 🏅 Day 35 - 新增、取消特定貼文讚 ## 題目 實作[動態牆頁面](https://xd.adobe.com/view/c0763dbe-fc15-42e8-be0b-8956ed03e675-9525/screen/ace2ccc4-7e50-401b-998a-a14f49e87918/)**新增及取消貼文讚的功能** **新增按讚** 設計 POST `/posts/:id/likes` 路由,需登入才能請求(id 為貼文 ID) * 當使用者登入並驗證 JWT 正確,修改資料庫中該貼文的 likes 欄位,將使用者 ID 加入 likes 陣列中(使用 `$addToSet`,避免加入重複的使用者 ID) * 若新增成功,回傳成功訊息及修改的貼文 ID、新增的使用者 ID **移除按讚** 設計 DELETE `/posts/:id/likes` 路由,需登入才能請求(id 為貼文 ID) * 當使用者登入並驗證 JWT 正確,修改資料庫中該貼文的 likes 欄位,將使用者 ID 由 likes 陣列中移除(使用 `$pull`) * 若移除成功,回傳成功訊息及修改的貼文 ID、已移除的使用者 ID **使用 Postman 測試是否正確運作** **將程式碼片段貼至 HackMD 並回報** ## 回報流程 將答案連結貼至底下回報就算完成了喔! 解答位置請參考下圖(需打開程式碼的部分觀看) ![](https://i.imgur.com/vftL5i0.png) <!-- 解答: 範例參考 https://github.com/gonsakon/express-week4-sample/blob/week8/routes/posts.js#L40-L65 ```javascript= // routes/posts.js const router = express.Router(); const Post = require('../models/postsModel'); const { isAuth } = require('../service/auth'); // 新增按讚 router.post('/:id/likes',isAuth, handleErrorAsync(async function(req, res, next) { const _id = req.params.id; await Post.findOneAndUpdate( { _id}, { $addToSet: { likes: req.user.id } } ); res.status(201).json({ status: 'success', postId: _id, userId: req.user.id }); })); // 移除按讚 router.delete('/:id/likes',isAuth, handleErrorAsync(async(req, res, next) => { const _id = req.params.id; await Post.findOneAndUpdate( { _id}, { $pull: { likes: req.user.id } } ); res.status(201).json({ status: 'success', postId: _id, userId: req.user.id }); })) ``` --> 回報區 --- | 報數 | 組別/Discord 名字 | Codepen/HackMD/其他回饋 | |:----:|:-----------------------:|:-------------------------------------------------------------------------:| | 1 | 中 4 組 / jimkk159 | [HackMD - Day 35](https://hackmd.io/CeECwwJfQ6mhDG_jMTAxYg) |