Node.js表单提交报错求助:TypeError读取conteudo属性失败
Node.js表单提交报错:TypeError: Cannot read properties of undefined (reading 'conteudo')
报错信息
TypeError: Cannot read properties of undefined (reading 'conteudo')
问题代码
const express=require("express"); const app=express(); const handlebars=require("express-handlebars"); const Sequelize=require("sequelize"); const sequelize=new Sequelize("test","root","88182231",{ host:"localhost", dialect:"mysql" }) app.get("/card",function(req,res){ res.render("form") }) app.post("/add",function(req,res){ res.send("conteudo:"+req.body.conteudo+" titulo:"+req.body.titulo) }) app.engine("handlebars", handlebars.engine({ defaultLayout: "main" })); app.set("view engine","handlebars"); app.use(express.urlencoded({extended:false})) app.use(express.json())
解决方案
问题根源是Express的请求体解析中间件被放在了路由定义之后,导致路由处理函数执行时req.body未被解析,处于undefined状态,因此无法读取conteudo属性。
只需将express.urlencoded和express.json中间件的调用移到所有路由定义之前即可修复:
const express=require("express"); const app=express(); const handlebars=require("express-handlebars"); const Sequelize=require("sequelize"); // 先加载请求体解析中间件 app.use(express.urlencoded({extended:false})) app.use(express.json()) const sequelize=new Sequelize("test","root","88182231",{ host:"localhost", dialect:"mysql" }) app.get("/card",function(req,res){ res.render("form") }) app.post("/add",function(req,res){ res.send("conteudo:"+req.body.conteudo+" titulo:"+req.body.titulo) }) app.engine("handlebars", handlebars.engine({ defaultLayout: "main" })); app.set("view engine","handlebars");
Express中间件按顺序执行,只有先通过解析中间件处理请求,后续路由才能访问到解析后的req.body。你之前更换数据库、修改数据类型的操作和该报错无关,因为问题出在请求体解析环节,尚未涉及数据库操作。
内容的提问来源于stack exchange,提问作者Luiz Fernando da silva
相关产品推荐
相关产品推荐

