使用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
相关产品推荐
相关产品推荐

