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

