Node.js提交表单存MongoDB报错Cannot read property 'cust_name' of undefined
问题根因
报错TypeError: Cannot read property 'cust_name' of undefined的核心是req.body的值为undefined,导致无法读取其下的cust_name属性,可按照以下步骤逐一排查:
排查步骤
检查body解析中间件是否正确配置
Express 4.16.0及以上版本已内置请求体解析能力,无需单独安装
body-parser依赖,需要在所有路由定义之前完成解析中间件的初始化,示例配置如下:const express = require('express') const app = express() // 初始化JSON格式请求体解析,对应你代码里的jsonParser变量 const jsonParser = express.json() // 如果前端是普通form表单提交(Content-Type为application/x-www-form-urlencoded),需要额外加这行 app.use(express.urlencoded({ extended: true }))如果你当前的
jsonParser变量没有正确初始化,也会导致请求体解析失败。检查请求头配置是否匹配
如果你前端发送的是JSON格式请求,必须确保请求头的
Content-Type字段值为application/json;如果是普通表单提交,确保已经配置了上述的urlencoded解析中间件。检查中间件加载顺序
所有请求解析中间件的配置代码,必须放在路由定义代码的前面,否则中间件不会对后续定义的路由生效,导致
req.body无法正常解析。修复代码里的笔误
你当前的数据库保存回调里存在变量名错误,会在保存出错时报额外的未定义错误:
// 原错误代码 if(err){ console.log(error); // 回调参数名为err,不存在error变量 } // 修改为 if(err){ console.log(err); }
修正后可运行的参考代码
/* index.js */ const express = require('express') const app = express() const mongoose = require('mongoose') const Leadlist = require('./list.model.js') // 要确保正确引入定义的模型 // 中间件配置放在最前面 const jsonParser = express.json() app.use(express.urlencoded({ extended: true })) // 路由定义 app.post('/leadtest',jsonParser, function(req, res){ const doc = new Leadlist(); doc.cust_name = req.body.cust_name; doc.save(function(err, data){ if(err){ console.log(err); res.status(500).send("数据保存失败") } else{ res.send("Data inserted"); } }); });
内容的提问来源于stack exchange,提问作者jayesh kaushal
相关产品推荐
相关产品推荐

