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

Mongoose的findByIdAndDelete()删除文档成功但接口无响应

问题解决:Express删除接口执行成功但无响应

你的问题核心是未完成HTTP响应周期——你仅设置了响应状态码,但没有发送实际响应内容,导致请求一直处于挂起状态,直到超时。

问题代码分析

在removeQuizById控制器中:

  • 成功删除Quiz后,仅执行了res.status(200);,但未调用res.send()/res.json()来结束请求响应流程
  • 当Quiz不存在时,设置404状态后抛出错误,若你的错误处理中间件未正确发送响应,也会加剧问题(但核心问题仍在成功分支的响应未收尾)

修正后的控制器代码

const removeQuizById = async (req, res, next) => {
  try {
    const { id } = req.params;
    const quiz = await Quizz.findById(id); // 补全const声明,避免全局变量污染
    if (quiz) {
      await Quizz.findByIdAndDelete(id);
      // 设置状态码并发送响应内容,结束请求周期
      return res.status(200).json({ message: "Quiz deleted successfully" });
    } else {
      // 直接返回404响应,无需抛错(若保留抛错,需确保错误中间件会发送响应)
      return res.status(404).json({ error: "Quiz does not exist" });
    }
  } catch (error) {
    // 捕获数据库查询等异常,交给错误处理中间件处理
    return next(error);
  }
};

module.exports = { getQuizById, removeQuizById };

额外优化建议

  1. 简化数据库操作:直接利用findByIdAndDelete的返回值,减少一次数据库查询:
const removeQuizById = async (req, res, next) => {
  try {
    const deletedQuiz = await Quizz.findByIdAndDelete(req.params.id);
    if (deletedQuiz) {
      return res.status(200).json({ 
        message: "Quiz deleted successfully", 
        data: deletedQuiz 
      });
    }
    return res.status(404).json({ error: "Quiz does not exist" });
  } catch (error) {
    return next(error);
  }
};
  1. 确保应用配置了错误处理中间件:
app.use((err, req, res, next) => {
  const statusCode = err.statusCode || 500;
  res.status(statusCode).json({
    error: err.message || "Internal Server Error"
  });
});

修正后调用DELETE接口,会立即返回对应状态的JSON响应,不会再出现请求挂起的情况。

内容的提问来源于stack exchange,提问作者Toni Dinca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:02:36