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

为何MongoDB Schema无法存储下拉框字段值?仅name字段可存入

问题:MongoDB仅存储name字段,其他字段无法存入

我尝试将branch、year、semester和subject字段存入MongoDB数据库,但仅能成功存储name字段(该字段仅用于测试Schema是否可正常存储数据)。运行Node服务器提交表单后,只有name字段被存入数据库,急需解决此问题。

我的Schema代码

const PaperSchema = new Schema({
    name: {type: String, maxLength: 100},
    branch: {type: String, maxLength: 100},
    year: {type: Number, minLength: 4, maxLength: 4},
    semester: {type: Number, minLength: 1, maxLength: 1},
    subject: {type: String, maxLength: 100}
});

对应的Pug视图代码

input#name(type="text" name="name")
label.fs-5.fw-normal.mt-2(for='branch') Branch
    select.form-select.my-1#branch(style="width:10rem;" required="")
        option(value="") Select
        - var branches = ['Computer Science & Engineering', 'Electronics & Communication Engineering', 'Electrical Engineering', 'Mechanical Engineering', 'Civil Engineering'];
        each branch in branches
            option= branch

label.fs-5.fw-normal.mt-2(for='year') Year
    select.form-select.my-1#year(style="width:10rem;" required="")
        option(value="") Select
        - var year = 2023;
        while year >= 2019
            option= year--

label.fs-5.fw-normal.mt-2(for='semester') Semester
    select.form-select.my-1#semester(style="width:10rem;" required="")
        option(value="") Select
        - var semester = 1;
        while semester <= 8
            option= semester++

label.fs-5.fw-normal.mt-2(for='subject') Subject
    select.form-select.my-1#subject(style="width:10rem;" required="")
        option(value="") Select
        option Computer Science & Engineering

input.btn.btn-primary.mt-3(type="submit" value="Submit")

解决方案

1. 给所有表单元素添加name属性

你的Pug代码里只有name输入框设置了name属性,其他select元素(branch、year、semester、subject)都缺失该属性。表单提交时,只有带name属性的字段才会被发送到后端,这是核心问题。

修改每个select标签,添加对应name属性:

select.form-select.my-1#branch(name="branch" style="width:10rem;" required="")
select.form-select.my-1#year(name="year" style="width:10rem;" required="")
select.form-select.my-1#semester(name="semester" style="width:10rem;" required="")
select.form-select.my-1#subject(name="subject" style="width:10rem;" required="")

2. 修正Schema中的数字类型验证错误

Schema里year和semester用了minLength/maxLength,但这两个验证仅适用于字符串类型,数字类型需改用min/max:

const PaperSchema = new Schema({
    name: {type: String, maxLength: 100},
    branch: {type: String, maxLength: 100},
    year: {type: Number, min: 2019, max: 2023},
    semester: {type: Number, min: 1, max: 8},
    subject: {type: String, maxLength: 100}
});

3. 后端确保正确接收并转换字段类型

表单提交的数值默认是字符串类型,后端需要转换为数字后再存入数据库:

router.post('/submit', async (req, res) => {
    try {
        const paper = new Paper({
            name: req.body.name,
            branch: req.body.branch,
            year: parseInt(req.body.year),
            semester: parseInt(req.body.semester),
            subject: req.body.subject
        });
        await paper.save();
        res.redirect('/success');
    } catch (err) {
        console.error(err);
        res.status(500).send('保存失败');
    }
});

内容的提问来源于stack exchange,提问作者Dev Anand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:13:14