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) })
问题原因及解决方案
核心问题
- 未引入mongoose:你的Comment Controller里根本没导入mongoose,直接调用
mongoose.Types.ObjectId.isValid()会触发ReferenceError: mongoose is not defined,这个未捕获的错误直接导致服务器崩溃,所以Postman会收到ECONNRESET(连接被重置,因为服务器挂了)。 - 方法已废弃:就算导入了mongoose,
mongoose.Types.ObjectId.isValid()也已经被废弃,官方推荐使用mongoose.isValidObjectId()替代。
修复步骤
- 在Comment Controller顶部添加mongoose导入:
const mongoose = require('mongoose'); const Comment = require("../models/Comment");
- 替换废弃的校验方法:
// 把原来的判断改成这个 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
相关产品推荐
相关产品推荐

