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

Express.js中Postman Delete请求失效及相关代码疑问

问题:Express.js删除评论时服务器崩溃,返回ECONNRESET错误

我用Express.js做后端,把评论存储到MongoDB里,但是在Postman测试Delete请求时出现了问题:服务器直接崩溃,Postman返回Error: read ECONNRESET。排查后发现是下面这段代码导致的,移除后Delete请求就恢复正常了,想问这段代码存在什么问题:

if (!mongoose.Types.ObjectId.isValid(id)) {
  return res.status(404).json({ error: "no such comment" });
}

[更新] 经确认该方法已被废弃。


相关代码

Comment Controller

const Comment = require("../models/Comment");

// delete a comment
const deleteComment = async (req, res) => {
  const {id} = req.params;
  
  if (!mongoose.Types.ObjectId.isValid(id)) {
    return res.status(404).json({ error: "no such comment" });
  }
  try {
    const comment = await Comment.findOneAndDelete({ _id: id });
    if (!comment) {
      return res.status(404).json({ error: "no such comment" });
    }
    res.status(200).json(comment);
  } catch (error) {
    res.status(500).json({ error: "Error deleting comment" });
  }
};

module.exports = {
  createComment,
  getComments,
  deleteComment,
};

Comment Route

const express = require('express');
const {
  createComment, 
  getComments,
  deleteComment,
} = require('../controllers/commentController');

const router = express.Router();

// GET comments for a specific post
router.get('/posts/:id/comments', getComments);

// CREATE a new comment for a specific post
router.post('/posts/:id/comments', createComment);

router.delete('/:id', deleteComment)

module.exports = router;

Server.js

require('dotenv').config()

const express = require('express');
const app = express()
const mongoose = require('mongoose');
const commentsRoute = require('./routes/commentsRoute');
const postsRoute = require('./routes/postsRoute')

// middleware
app.use(express.json())

app.use((req,res,next)=>{
  console.log(req.path, req.method)
  next()
})

// routes
// mount the comment routes
app.use('/api', commentsRoute);
app.use('/api', postsRoute);

// connect to db
mongoose.connect(process.env.MONGO_URI)
  .then(()=>{
    // listen for requests
    app.listen(process.env.PORT, ()=>{
      console.log('connected to db and listening on port', process.env.PORT)
    })
  })
  .catch((error)=>{
    console.log(error)
  })

问题原因及解决方案

核心问题

  1. 未引入mongoose:你的Comment Controller里根本没导入mongoose,直接调用mongoose.Types.ObjectId.isValid()会触发ReferenceError: mongoose is not defined,这个未捕获的错误直接导致服务器崩溃,所以Postman会收到ECONNRESET(连接被重置,因为服务器挂了)。
  2. 方法已废弃:就算导入了mongoose,mongoose.Types.ObjectId.isValid()也已经被废弃,官方推荐使用mongoose.isValidObjectId()替代。

修复步骤

  1. 在Comment Controller顶部添加mongoose导入:
const mongoose = require('mongoose');
const Comment = require("../models/Comment");
  1. 替换废弃的校验方法:
// 把原来的判断改成这个
if (!mongoose.isValidObjectId(id)) {
  return res.status(404).json({ error: "no such comment" });
}

额外优化(可选)

其实可以不用手动校验ObjectId格式,因为当你传入非法格式的id给findOneAndDelete时,Mongoose会抛出CastError,你可以在catch块里统一处理这种情况,这样代码更简洁:

const deleteComment = async (req, res) => {
  const {id} = req.params;
  try {
    const comment = await Comment.findOneAndDelete({ _id: id });
    if (!comment) {
      return res.status(404).json({ error: "no such comment" });
    }
    res.status(200).json(comment);
  } catch (error) {
    // 处理非法ObjectId格式的情况
    if (error.name === 'CastError') {
      return res.status(404).json({ error: "no such comment" });
    }
    res.status(500).json({ error: "Error deleting comment" });
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:25:55