NodeJS+ExpressJS+EJS项目中Attendance数据无法存入MongoDB问题求助
问题排查及修复方案
- Schema结构定义错误:把
aMeal嵌套到了mDate的字段配置里,而mDate本身声明为Date类型,无法存储嵌套的用餐记录对象,属于结构定义错误。同时你手动声明了_id为必填String类型,但POST请求时没有传入_id值,会直接触发必填校验失败。另外mDate设置了unique唯一约束,同一天如果要录入多个入托人员的用餐记录会直接冲突,逻辑不合理。 - POST路由字段映射完全不匹配:Schema中关联入托人员的字段名为
participant,但你传的是不存在的pId字段;用餐记录都在aMeal嵌套对象下,你直接把用餐字段写到了Attendance实例的顶层,而且字段名大小写不匹配(Schema中是pmSnacks,你传的是PmSnacks)。 - 视图层错误:首先
participants.lenth是拼写错误,正确写法是length;其次所有入托人员的表单输入项name都重复,提交时只会传递最后一条记录的值;ObjectId类型直接用===比较会因为类型问题判断失败,需要转成字符串对比;另外你没有把输入项包裹在<form>标签中,表单根本无法正常提交。
修正后的Attendance Schema
const mongoose = require('mongoose') const attendanceSchema = new mongoose.Schema({ // 去掉手动声明的_id,让mongoose自动生成ObjectId,避免手动传值的问题 mDate: { type: Date, default: Date.now, required: [true, 'Date is required'] // 去掉unique约束,允许同一天多条记录 }, // 把aMeal提到顶层,和mDate平级 aMeal: { Breakfast: { type: String, default: '' }, Lunch: { type: String, default: '' }, pmSnacks: { type: String, default: '' }, Dinner: { type: String, default: '' } }, participant: { type: mongoose.Schema.Types.ObjectId, required: true, ref: 'Participant' } }, { timestamps: true }) module.exports = mongoose.model('Attendance', attendanceSchema)
修正后的POST路由代码
router.post('/', async (req, res) => { const attendance = new Attendance({ // 关联字段名和Schema保持一致,用participant接收pId participant: req.body.pId, // 嵌套字段要对应结构 aMeal: { Breakfast: req.body.Breakfast || '', Lunch: req.body.Lunch || '', pmSnacks: req.body.PmSnacks || '', Dinner: req.body.Dinner || '' } }) try { await attendance.save() res.redirect(`attendance`) } catch (err) { // 可打印err查看具体错误,方便后续调试 console.log('保存错误:', err) showattendance(res, attendance, true) } })
视图层修改要点
- 把所有输入项包裹在
<form method="POST" action="/attendance">标签内 - 修复length拼写错误:
<% if (participants.length !== 0) { %> - ObjectId比较转成字符串:
<% if (participant._id.toString() === attendance.participant?.toString() && attendance.mDate?.aMeal?.Breakfast === 'Yes' ) { %> - 如果要批量提交多条入托人员的记录,需要把input的name改成数组形式,比如
name="pId[]"、name="Breakfast[]",后台接收后循环批量插入即可。
内容的提问来源于stack exchange,提问作者Mazumder Nazmul
相关产品推荐
相关产品推荐

