You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 06:20:48