React.js实现博客评论功能报ObjectId转换错误该如何解决
错误根因排查
你碰到的报错本质是React端发起请求时没有正确填充路由参数、请求体字段错误导致的,具体有2个问题:
- 问题1:请求URL的占位符未替换
你当前axios请求的路径写死为"/posts/:id/comment",没有把:id替换为实际的帖子ID值,导致后端接收到的req.params.id就是字符串":id",MongoDB自然无法把这个字符串转换成合法的ObjectId,就抛出了你看到的CastError。 - 问题2:请求体传递了多余的错误字段
你构造的newComment对象里手动传了_id: postId,这个字段完全多余:Comment的_id是MongoDB创建文档时自动生成的,你不需要手动赋值,而且你把帖子ID赋值给评论ID的逻辑也是完全错误的。
修正后的React端代码
const [commentdescription, setCommentDescription] = useState('') const [postId, setPostId] = useState() // 提交评论函数 const handleComment = async ()=>{ // 去掉多余的_id字段,只传接口需要的评论内容和作者ID const newComment = { author: user._id, commentdescription, }; try{ // 用模板字符串替换路由里的:id为实际的postId值 await axios.post(`/posts/${postId}/comment`, newComment); }catch(err){ console.log(err) } }
可选的后端代码优化(不影响当前功能运行,仅规范写法)
你当前后端接口里用的Post.findByIdAndUpdate用法不规范,你没有传要更新的内容,只是做了查询操作,建议直接改成Post.findById(req.params.id),语义更清晰。
内容的提问来源于stack exchange,提问作者kinhs
相关产品推荐
相关产品推荐

