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

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的对象,而是空字符串。大概率是以下两个原因:

  1. Express应用未配置JSON解析中间件,导致req.body没有被解析为JSON对象,而是原始的空字符串或格式错误的文本。
  2. Postman请求的Body格式错误,未正确传递JSON对象。

修复步骤

  1. 配置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());
    
  2. 检查Postman请求配置

    • 确保请求的Headers中设置了Content-Type: application/json
    • 切换到Body标签,选择raw格式,然后在下拉框中选择JSON,输入符合要求的评论对象,示例:
      {
        "creator": "你的用户名",
        "comentario": "测试评论内容",
        "raiting": 4
      }
      

    注意不要留空Body,也不要输入非JSON格式的文本。

  3. 增强参数校验(可选)
    可以在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:13:14