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

使用Node+Express+Mongoose向MongoDB传值仅返回_id和__v如何解决

问题排查与修复方案

1. 修复insertUser方法的Promise逻辑错误

你当前的insertUser封装中,Promise实例没有主动调用resolve和reject,导致await无法正常拿到返回结果,后续逻辑也无法正确执行:

const insertUser = (userObj) => {
    return new Promise((resolve,reject) =>{
    UserSchema(userObj)
    .save()
    .then((data) => {
      console.log(data)
      resolve(data) // 新增该行,抛出保存成功的结果
    })
    .catch((error) => {
      console.log(error)
      reject(error) // 新增该行,抛出错误信息
    })
    })
}
// 更简洁的优化写法:无需手动封装Promise,直接返回save方法本身的Promise即可
// const insertUser = (userObj) => UserSchema(userObj).save()
module.exports = { insertUser,};

2. 修复路由中result的作用域问题

你在try代码块内部用const定义的result,块外部无法访问,会抛出undefined错误,调整代码位置如下:

router.post("/", async (req,res) => {
  let result; // 将result的作用域提升到块外部
  try {
    result = await insertUser(req.body);
    console.log(result);
    res.json({message: "new user created", result}) // 成功响应放到try内部,避免出错后还返回成功状态
  }catch (error) {
    console.log(error)
    res.json({status: "error", message: error.message})
  }
}); 

3. 检查Mongoose Schema定义

这是最可能导致仅存入_id和__v的核心原因:Mongoose会自动过滤所有没有在Schema中声明的字段。请确认你的Schema里显式定义了所有需要传入存储的字段,参考示例:

// 错误示例:没有定义要存储的字段,所有传入的body内容都会被过滤
const userSchema = new mongoose.Schema({})

// 正确示例:显式声明所有要存储的字段
const userSchema = new mongoose.Schema({
  name: String,
  age: Number,
  email: String
  // 其余你需要传入的字段都要在这里一一声明
})
const UserSchema = mongoose.model('User', userSchema)

4. 检查请求配置与中间件配置

  • 发送POST请求时请确认请求头Content-Type设置为application/json,如果是表单提交则设置为application/x-www-form-urlencoded
  • 调整urlencoded中间件配置,加上extended: true避免解析嵌套参数时出错:
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
  • 可以在路由内部先打印console.log(req.body)做验证:如果打印为空就是中间件或者请求头配置的问题,如果能正常拿到传入的参数就是Schema定义的问题。

内容的提问来源于stack exchange,提问作者GokuCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:45:03