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

