MongoDB重复检查失效+Next.js API响应异常问题求助
问题分析与修复方案
1. 重复点赞的原因
你的查询条件写法错误,导致始终无法正确检测用户是否已点赞:
db.collection('quotes').findOne({ likes: { by: cookies.get('user') } })
这种写法是精确匹配整个likes对象,只有当likes对象完全等于{ by: 用户ID }时才会匹配,但你的likes结构是包含num和by数组的复合对象,所以这个查询永远返回null,导致每次都会执行点赞逻辑。
正确的写法应该是检查likes.by数组中是否包含当前用户,同时必须指定目标quote的_id,避免查询所有文档:
db.collection('quotes').findOne({ _id: new ObjectId(req.body.id), "likes.by": cookies.get('user') })
2. API未响应的原因
- 当用户已点赞(
liked存在)时,代码未返回任何响应,导致请求挂起,触发API resolved without sending a response错误。 - 混用回调函数与
async/await,异步流程管理混乱,可能导致响应时机异常。
修复后的完整代码
import clientPromise from "../../lib/mongodb"; const ObjectId = require('mongodb').ObjectId; import Cookies from 'cookies' export default async function handler(req, res) { switch (req.method) { case 'POST': { return like(req, res); } default: res.status(405).json({ message: 'Method not allowed', success: false }); } } async function like(req, res) { const cookies = new Cookies(req, res) const userId = cookies.get('user'); if (!userId) { return res.status(403).json({ message: 'Error: Cookies not found', success: false }) } try { const client = await clientPromise; const db = client.db("the-quotes-place"); const quoteId = new ObjectId(req.body.id); // 检查当前用户是否已给该quote点赞 const liked = await db.collection('quotes').findOne({ _id: quoteId, "likes.by": userId }); if (!liked) { // 未点赞则添加点赞并递增计数 await db.collection('quotes').updateOne( { _id: quoteId }, { $inc: { "likes.num": 1 }, $push: { "likes.by": userId } } ); return res.status(200).json({ message: 'Successfully added like', success: true }); } else { // 已点赞则返回提示,避免重复操作 return res.status(400).json({ message: 'You already liked this quote', success: false }); } } catch (error) { // 捕获异常并返回错误响应 console.error('Like error:', error); return res.status(500).json({ message: 'Internal server error', success: false }); } }
关键修改点
- 统一使用
async/await替代回调函数,避免异步嵌套问题 - 修正查询条件,指定
_id并正确检查likes.by数组中的用户 - 补充所有分支的响应返回(包括已点赞、异常情况)
- 添加错误捕获,处理数据库操作可能出现的异常
- 优化变量命名,提升代码可读性
内容的提问来源于stack exchange,提问作者Scollier
相关产品推荐
相关产品推荐

