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

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)
    }
})

视图层修改要点

  1. 把所有输入项包裹在<form method="POST" action="/attendance">标签内
  2. 修复length拼写错误:<% if (participants.length !== 0) { %>
  3. ObjectId比较转成字符串:<% if (participant._id.toString() === attendance.participant?.toString() && attendance.mDate?.aMeal?.Breakfast === 'Yes' ) { %>
  4. 如果要批量提交多条入托人员的记录,需要把input的name改成数组形式,比如name="pId[]"、name="Breakfast[]",后台接收后循环批量插入即可。

内容的提问来源于stack exchange,提问作者Mazumder Nazmul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:15:03