通过POST请求向MongoDB子文档数组推送数据失败如何解决
你提交的请求体结构和Mongoose定义的Schema结构不匹配,只有顶层的name字段和Schema对应,嵌套的子文档字段没有按数组嵌套结构传递,所以无法写入。
1. 调整前端请求体结构
你需要把提交的数据按照Schema定义的嵌套结构组装:
- 顶层
workout是数组,每个元素对应exerciseSchema结构 exerciseSchema里的workoutContent也是数组,每个元素对应WodSchema结构- 注意
WodSchema的repCount是必填字段,必须传值,否则会触发校验报错
修改后的前端代码示例:
const [name, setName] = useState(""); const [workoutName, setWorkoutName] = useState(""); const [exerciseName, setExerciseName] = useState(""); // 新增repCount状态,对应WodSchema的必填字段 const [repCount, setRepCount] = useState(""); const editProgram = async () => { try { const res = await fetch(`http://localhost:3000/api/workouts/`, { method: "POST", headers: { Accept: "application/json", "Content-Type": "application/json", }, // 按Schema结构组装请求体 body: JSON.stringify({ name, workout: [ { workoutName, workoutContent: [ { exerciseName, repCount } ] } ] }), }); } catch (error) { console.log(error); } };
如果需要提交多个训练计划、多个动作,直接对应扩充workout和workoutContent数组的元素即可。
2. 后端新增错误日志便于排查
当前后端的错误捕获逻辑没有输出具体错误,无法判断是否是字段校验、结构错误导致的保存失败,建议修改catch块:
export default async (req, res) => { const { method } = req; switch (method) { case "POST": try { const workout = req.body; const newWorkout = new Workout({ ...workout }); await newWorkout.save(); res.status(201).json({ success: true, data: newWorkout }); } catch (error) { // 新增错误日志输出,开发环境可以直接看报错原因 console.log("保存失败原因:", error) res.status(400).json({ success: false, error: error.message }); } break; // 剩下的原有逻辑
注意事项
如果你的业务是动态添加多个训练项,需要在前端维护好嵌套数组的结构,不要把嵌套字段直接平级放在请求体中,Mongoose只会按Schema定义的结构匹配数据,不匹配的字段会自动忽略。
内容的提问来源于stack exchange,提问作者Eric Pezzulo
相关产品推荐
相关产品推荐

