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

用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:45:34