Mongoose报错:Parameter 'obj' to Document()需为对象,实际为字符串求助
问题:Mongoose添加子文档时报错“Parameter "obj" to Document() must be an object, got "" (type string)”
我在Postman中调用添加评论接口时遇到上述错误,以下是我的Mongoose Model和Controller代码,尝试过常见方案但问题未解决,求排查修复:
Model 代码
const mongoose = require("mongoose"); const mongoosePaginate = require("mongoose-paginate-v2"); const ComentariosSchema = mongoose.Schema({ creator: String, comentario: String, created_at: { type: Date, default: Date.now }, raiting: Number }); const SoporteSchema = mongoose.Schema({ folio: { type: Number, unique: true }, documentos: String, servicio: String, descripcion: String, dueno: String, asignado: String, estado: String, prioridad: String, created_at: Date, MotivoCancel: String, CancelDate: Date, Cancelby: String, AsignDate: Date, comentarios: [ComentariosSchema] }); SoporteSchema.plugin(mongoosePaginate); module.exports = mongoose.model("Soporte", SoporteSchema);
Controller 代码
const Soporte = require("../models/soporte"); async function addComnentarios(req, res) { try { const soporteId = req.params.id; const comentario = req.body; console.log("Comentario: ", comentario); if (!comentario || typeof comentario !== 'object' || Array.isArray(comentario)) { return res.status(400).send({ msg: "Comentario inválido" }); } console.log("Req.body", req.body); const soporte = await Soporte.findById(soporteId); console.log(soporte); if (!soporte) { return res.status(404).send({ msg: "Ticket no encontrado" }); } soporte.comentarios.push(comentario); const comentarioUpdated = await soporte.save(); console.log(comentarioUpdated); res.status(200).send({ msg: "Comentario creado", comentarioUpdated }); } catch (error) { res.status(400).send({ msg: "Error al crear el comentario", error }); } }
排查与解决方案
问题根源
报错提示说明你尝试往comentarios数组中插入的不是符合Schema的对象,而是空字符串。大概率是以下两个原因:
- Express应用未配置JSON解析中间件,导致
req.body没有被解析为JSON对象,而是原始的空字符串或格式错误的文本。 - Postman请求的Body格式错误,未正确传递JSON对象。
修复步骤
配置Express JSON解析中间件
在你的项目入口文件(如app.js或server.js)中添加以下代码,确保Express能正确解析JSON格式的请求体:// Express 4.16+ 内置了json解析,无需额外安装body-parser const express = require('express'); const app = express(); // 必须在路由之前配置 app.use(express.json());检查Postman请求配置
- 确保请求的
Headers中设置了Content-Type: application/json - 切换到
Body标签,选择raw格式,然后在下拉框中选择JSON,输入符合要求的评论对象,示例:{ "creator": "你的用户名", "comentario": "测试评论内容", "raiting": 4 }
注意不要留空Body,也不要输入非JSON格式的文本。
- 确保请求的
增强参数校验(可选)
可以在Controller中增加对必填字段的校验,避免传入不完整的对象:// 在原有校验后添加 const requiredFields = ['creator', 'comentario']; const missingFields = requiredFields.filter(field => !comentario[field]); if (missingFields.length > 0) { return res.status(400).send({ msg: `缺少必填字段: ${missingFields.join(', ')}` }); }
内容的提问来源于stack exchange,提问作者Gael Maldonado
相关产品推荐
相关产品推荐

