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

表单提交报错Cannot read properties of undefined (reading 'name')求助

表单提交报错:Cannot read properties of undefined (reading 'name')

问题现象

localhost:4000可正常加载Appointment.html,但点击提交按钮路由到localhost:4000/add时,控制台抛出错误:Cannot read properties of undefined (reading 'name')

问题代码

app.js

const app = express();
const bodyParser = require('body-parser');
const router = require('./route/router');
app.use(router)

app.use(express.static(__dirname + '/public'));

app.use(bodyParser.json);
app.use(
  bodyParser.urlencoded({
    extended: false,
  }),
);

app.listen(4000);

router.js

const express = require('express');
const bodyParser = require('body-parser');
const controller = require('../controller/controller');

const router = express.Router();
router.get('/',controller.homePage);
router.get('/add',controller.getItem);
router.post('/add',(res,req)=>{console.log(res.body.name)})


module.exports = router;

controller.js

const { query } = require('express');
const Item = require('../models/item')


exports.getItem = (req, res, next) => {
    console.log('get!'+req)
}
exports.postItem = (req, res, next) => {
    console.log(req.body.name)
};

exports.homePage = (req, res, next) =>{
    res.sendFile(__dirname + '/Appointment.html');
}

错误原因及修复方案

1. 中间件加载顺序错误

app.js中先加载了路由router,后加载body-parser。这会导致路由处理请求时,请求体还没被解析,req.body自然是undefined。

修复:调整顺序,先加载解析中间件,再加载路由:

// 先初始化请求体解析中间件
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

// 再加载路由
app.use(router);

2. bodyParser.json调用缺少括号

bodyParser.json是函数,需要调用才能返回中间件实例。原代码少了(),导致JSON解析中间件未正确初始化。

修复:改为bodyParser.json()

3. 路由回调参数顺序颠倒

router.js的post('/add')回调中,参数顺序写成了(res, req),而Express路由回调的正确顺序是(req, res, next)。这会导致错误地从res.body读取属性,但res对象根本没有body属性。

修复:调整参数顺序为(req, res):

router.post('/add',(req, res)=>{console.log(req.body.name)})

4. (可选)统一使用controller处理逻辑

建议统一使用controller.js中的postItem方法,保持代码结构一致:

router.post('/add', controller.postItem);

修正后的完整代码

app.js

const app = express();
const bodyParser = require('body-parser');
const router = require('./route/router');

// 先加载请求体解析中间件
app.use(bodyParser.json());
app.use(
  bodyParser.urlencoded({
    extended: false,
  }),
);

// 加载路由
app.use(router);
app.use(express.static(__dirname + '/public'));

app.listen(4000);

router.js

const express = require('express');
const controller = require('../controller/controller');

const router = express.Router();
router.get('/', controller.homePage);
router.get('/add', controller.getItem);
router.post('/add', controller.postItem);

module.exports = router;

controller.js无需修改,postItem方法已正确读取req.body.name。

内容的提问来源于stack exchange,提问作者Aniket Ingawale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:32:50