使用Mongoose保存HBS表单值时遇报错:Parameter "obj" to Document() must be an object, got 14
问题:Mongoose保存数据时报错“Parameter "obj" to Document() must be an object, got 14”
我正在使用Mongoose,尝试通过HBS表单的submit和POST方法保存一个值,提交后在本地主机网页上显示报错:“Parameter "obj" to Document() must be an object, got 14”。
用户提供的代码
路由代码
var express = require('express'); var router = express.Router(); var {grades} = require('../modeloUser'); const buscar ={}; const bodyParser = require('body-parser'); var {Save} = require ('../models/Save'); router.get('/', function(req, res, next) { buscar.guardar() .then(a=>{ res.render('obtener',{prop: a}); }) }); router.post('/save', (req, res) => { const save =Save(`${req.body.fname}`) console.log("valor esperado"+save); return save; }); buscar.guardar = async()=>{ const notes = await grades.find({student_id:{$eq:14}}); return notes; } module.exports = router;
模型代码
const saveSchema = new mongoose.Schema( { busqueda:Number },{ timestamp:true } ); const Save = new mongoose.model('Save',saveSchema); module.exports ={Save}
错误原因
POST路由中创建Mongoose模型实例的方式错误:
- Mongoose模型构造函数要求传入符合Schema结构的对象,但你直接传入了字符串/数值
${req.body.fname},导致Mongoose无法解析成合法的Document对象,触发报错。 - 另外,创建模型实例时规范写法是
new Save(...)(即使Mongoose允许省略new,核心问题仍在于参数类型错误)。
修正方案
修正后的POST路由代码
router.post('/save', async (req, res) => { // 1. 将表单提交的字符串转为数字,匹配Schema定义的Number类型 const busquedaValue = Number(req.body.fname); // 2. 传入包含busqueda字段的对象创建模型实例 const save = new Save({ busqueda: busquedaValue }); try { // 3. 异步保存到数据库 await save.save(); console.log("保存成功:", save); // 保存完成后重定向到首页或返回响应 res.redirect('/'); } catch (err) { console.error("保存失败:", err); res.status(500).send("数据保存出错"); } });
额外注意事项
- 确保Express已配置body-parser解析表单数据,在项目入口文件(如app.js)中添加:
app.use(bodyParser.urlencoded({ extended: true })); - 保存操作是异步的,必须用
await或.then()处理,否则无法确保数据成功写入数据库。 - 若
req.body.fname可能为空或非数字,建议添加额外的参数校验逻辑,避免无效数据存入。
内容的提问来源于stack exchange,提问作者Aaron Rodriguez
相关产品推荐
相关产品推荐

