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 };
额外优化建议
- 简化数据库操作:直接利用
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); } };
- 确保应用配置了错误处理中间件:
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
相关产品推荐
相关产品推荐

