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

Node.js应用HTML表单POST更新用户失败,Postman可正常执行

问题:HTML表单POST请求无法更新用户数据,但Postman可正常执行

我在Node.js应用中尝试通过HTML表单发送POST请求更新用户数据时失败,但使用Postman调用相同路径http://localhost:3000/traning-user/12并传递JSON数据时,更新操作可正常执行。我的需求是通过HTML表单的POST请求完成数据库更新。

相关代码

控制器代码

// Controller
exports.updatedTraningUserData = (req, res) => {
    const traningId = req.params.id;
    const updatedUserData = req.body; // 从请求体获取更新的用户数据

    // 更新数据库中的用户
    const sql = 'UPDATE traning SET certificationCode = ?, fullName = ?, company = ?, position = ?, email = ?, telephone = ?, date = ?, title = ?, futureTopics = ? WHERE id = ?';
    const values = [updatedUserData.certificationCode, updatedUserData.fullName, updatedUserData.company, updatedUserData.position, updatedUserData.email, updatedUserData.telephone, updatedUserData.date, updatedUserData.title, updatedUserData.futureTopics, traningId];

    db.query(sql, values, (err, results) => {
      if (err) {
        console.error('更新用户出错: ' + err.message);
        res.status(500).send('更新用户失败');
      } else {
        const traningUpdate = results;
        console.log(traningUpdate);
        console.log('用户更新成功');
        res.status(200).send('用户更新成功');
      }
    });
};

traningUser.ejs表单代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>traning User</title>
</head>
<body>
    <h1><%= traning.fullName %></h1>
    <div class="container">
      <form class="is-readonly" action="/traning-user/:id" method="post">
        <div class="form-group">
          <label for="certificationCode">Certification Code</label>
          <input type="text" class="form-control is-disabled" id="certificationCode" placeholder="<%- traning.certificationCode %>" value="<%- traning.certificationCode %>" name="certificationCode" disabled>
        </div>
      <div class="form-group">
          <label for="fullName">Fullname</label>
          <input type="text" class="form-control is-disabled" id="fullName" placeholder="fullName" value="<%- traning.fullName %>" name="fullName" disabled>
        </div>
        <div class="form-group">
          <label for="company">Company</label>
          <input type="text" class="form-control is-disabled" id="company" placeholder="<%- traning.company %>" value="<%- traning.company %>" name="company" disabled>
        </div>
        <!-- 其他表单字段省略 -->
      </form>
    </div>
</body>
</html>

route.js路由代码

// routes目录下的traningRoutes.js文件
const express = require('express');
const router = express.Router();
const traningController = require('../controllers/traning');

router.post('/traning', traningController.createTraningUser);
router.delete('/traning/:id', traningController.deleteTraningUsers);
router.get('/traning-user', traningController.getTraningUsers);
router.post('/traning-user/:id', traningController.updatedTraningUserData); // 目标路由
router.get('/display/:id', traningController.test);
router.get('/traning-user/:id', traningController.getTraningUserById);

module.exports = router;

解决方案

1. 修正表单action路径

表单的action使用了占位符:id,无法被EJS解析为真实用户ID,需替换为当前用户的实际ID:

<form class="is-readonly" action="/traning-user/<%= traning.id %>" method="post">

2. 处理表单元素的disabled属性

disabled属性会导致表单元素的值不被提交到服务器,进而使req.body缺失字段。若允许用户修改字段,直接移除disabled;若仅需展示但要提交现有值,替换为readonly:

<input type="text" class="form-control is-disabled" id="certificationCode" placeholder="<%- traning.certificationCode %>" value="<%- traning.certificationCode %>" name="certificationCode" readonly>

3. 配置Express解析表单数据

HTML表单默认以application/x-www-form-urlencoded格式提交数据,需确保Express应用在主入口文件(如app.js)中配置对应中间件:

app.use(express.urlencoded({ extended: true }));

注:Postman使用JSON格式时依赖express.json()中间件,但表单提交需单独配置urlencoded

完成以上修改后,HTML表单的POST请求即可正常提交数据并执行数据库更新。

内容的提问来源于stack exchange,提问作者Italy Zia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 04:35:23