用Postman测试MongoDB API时遇TypeError: Cannot read properties of undefined (reading 'push')
解决Postman测试POST API时返回空消息及TypeError问题
问题现象
按照YouTube教程编写代码后,用Postman发送POST请求添加菜单,响应区域返回空消息,后台控制台会抛出TypeError错误。
问题根源
User Schema中定义的关联菜单的字段是orders,但菜单控制器的addMenu函数里调用了existingUser.menus.push(menu)——menus字段在User模型中根本没定义,push操作触发TypeError,导致数据库事务无法正常提交,最终API返回异常空消息。
修复方案
你有两种选择来解决这个字段不匹配的问题:
方案1:修改User Schema,将字段名改为menus
把User模型里的orders字段改成menus,和控制器代码中的调用保持一致:
import mongoose from 'mongoose' const Schema = mongoose.Schema; const userSchema = new Schema({ name: { type: String, required: true }, email: { type: String, required: true, unique: true }, password: { type: String, required: true, minlength: 6 }, // 替换原有的orders字段为menus menus: [{ type: mongoose.Types.ObjectId, ref: "Menu", required: true }], }) export default mongoose.model("User", userSchema);
方案2:修改控制器代码,调用正确的字段名orders
在addMenu函数的事务处理部分,把existingUser.menus.push(menu)改成existingUser.orders.push(menu),匹配User Schema的定义:
try{ const session=await mongoose.startSession(); session.startTransaction(); await menu.save({session}); // 修改这一行,使用正确的字段名orders existingUser.orders.push(menu); await existingUser.save({session}) await session.commitTransaction(); }catch(err){ console.log(err) return res.status(500).json({message:err}); }
额外注意事项
- 修改Schema后必须重启Node.js服务,确保Mongoose加载更新后的模型
- 如果数据库中已有用户文档,新增的
menus字段会自动以空数组形式添加到旧文档中,不影响现有数据 - 事务中任何一步抛出异常都会触发回滚,所以要确保所有操作都符合模型定义,避免中途出错
内容的提问来源于stack exchange,提问作者Samarth Bagga
相关产品推荐
相关产品推荐

