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

MERN栈工单系统开发中MongoDB无法创建message存储数组求助

解决方案

1. 调整 Ticket Schema 结构

首先替换你原有不合理的descs字段,新增messages数组,单条记录对应一条会话内容,同时存储发送者信息、发送时间,方便后续渲染会话列表:

const mongoose = require('mongoose');
const User = require('./userScheema');

const TicketScheema=new mongoose.Schema({
    subject:{
        type:String
    },
    request:{
        type:String
    },
    orderID:{
        type:Number
    },
    // 替换原有descs字段,新增messages数组存储所有会话
    messages:[
        {
            // 消息内容
            content: {
                type: String,
                required: true
            },
            // 发送者ID
            senderId: {
                type: mongoose.Schema.Types.ObjectId,
                ref: User,
                required: true
            },
            // 发送者姓名
            senderName: {
                type: String,
                required: true
            },
            // 发送者角色(用户/管理员)
            senderRole: {
                type: String,
                required: true
            },
            // 发送时间
            sendTime: {
                type: Date,
                default: Date.now
            }
        }
    ],
    name:{
        type:String
    },
    role:{
        type:String
    },
    payment:{
        type:String
    },
    transactionID:{
        type:Number
    },
    status:{
        type:String,
        default:"Not Answered"
    },
    date:{
        type:Date,
        default:Date.now
    },
    user:{
        type:mongoose.Schema.Types.ObjectId,
        ref:User,
        required:true
    }
})

const Ticket=mongoose.model("Ticket",TicketScheema);
module.exports=Ticket;

2. 修改创建工单的Express路由

创建工单时把用户提交的第一条问题描述作为messages数组的第一个元素传入,同时补全save方法的await关键字,避免异步逻辑出错:

router.post("/submitTicket",authenticateUser,async(req,res)=>{
     try {
        let user=req.root_user[0]._id.toString();
        let role=req.root_user[0].role.toString();
        let name=req.root_user[0].name.toString();
        let {subject,request,orderID,desc,payment,transactionID}=req.body;
        let resp=await new Ticket({
            subject,
            request,
            orderID,
            // 把用户提交的第一条消息存入messages数组
            messages: [{
                content: desc,
                senderId: user,
                senderName: name,
                senderRole: role
            }],
            payment,
            transactionID,
            user,
            role,
            name
        })
        // 补全await
        await resp.save();
        res.status(201).send(resp)
     } catch (error) {
         console.log(error) // 建议加日志方便排查问题
         res.status(400).send("Unable to create Ticket")
     }
 })

3. (可选)补充管理员回复的更新路由

后续管理员回复工单时,用MongoDB的$push操作符直接往messages数组追加新记录即可,示例如下:

router.post("/replyTicket/:ticketId",authenticateAdmin,async(req,res)=>{
     try {
        const { ticketId } = req.params;
        const { replyContent } = req.body;
        let admin=req.root_admin[0];
        const updatedTicket = await Ticket.findByIdAndUpdate(
            ticketId,
            {
                // 追加新回复到messages数组
                $push: {
                    messages: {
                        content: replyContent,
                        senderId: admin._id,
                        senderName: admin.name,
                        senderRole: admin.role
                    }
                },
                status: "Replied"
            },
            { new: true } // 返回更新后的工单数据
        )
        res.status(200).send(updatedTicket)
     } catch (error) {
         res.status(400).send("回复工单失败")
     }
 })

4. 前端代码无需调整

你现有前端的传参逻辑完全兼容修改后的后端,不用做改动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:36:01