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

Express Validator服务端校验后触发Ajax 400错误排查求助

解决表单校验后400错误及TypeError: Cannot read properties of undefined (reading 'errors')问题

一、直接触发TypeError的前端问题

你的fetch请求第一个then块没有返回response.json(),导致第二个then接收的response是undefined,自然无法读取errors属性。修改如下:

.then((response) => {
  return response.json(); // 必须返回这个Promise,才能传递到下一个then
})

二、前端Fetch请求头配置错误

你手动设置了contentType: "application/json; charset=utf-8",但请求体用的是FormData,这会导致请求头与数据格式不匹配,Express无法正确解析表单数据。直接移除这个配置即可,FormData会自动生成正确的multipart/form-data请求头:

fetch('/contact/', {
    method: 'POST',
    body: formData,
    mode: 'cors'
    // 删掉contentType配置
})

三、服务端需配置FormData解析中间件

表单是enctype="multipart/form-data"格式,Express默认的express.urlencoded()无法解析这种格式,需要用multer中间件处理:

  1. 安装依赖:
npm install multer
  1. 在Express应用中配置并使用:
const multer = require('multer');
const upload = multer(); // 仅解析数据,不存储文件

// 在路由中添加upload.none()(因为表单没有文件上传)
app.post('/contact/', upload.none(), contactValidate, (req, res) => {
  // 处理表单提交逻辑
  res.json({msg: 'Message sent successfully'});
});

四、服务端校验规则的潜在问题

  1. phone字段缺少存在性校验:如果用户未填写phone,check('phone')会因为字段不存在跳过后续校验,需添加.exists():
check('phone')
  .exists() // 新增该行
  .trim()
  .escape()
  .not()
  .isEmpty()
  .withMessage('Phone can not be empty!')
  .bail()
  .isMobilePhone()
  .withMessage('Must be a phone number.')
  .bail(),
  1. botCheck字段适配checkbox特性:checkbox未勾选时不会提交该字段,若要求必须勾选,需调整校验规则确保字段不存在时也触发错误:
check('botCheck')
  .exists({checkFalsy: true}) // 字段不存在或为假值时触发错误
  .isIn(["on"])
  .withMessage("Bot Check Failed")
  .bail(),

五、前端表单重置逻辑错误

你用value.textContent = ''重置表单字段是错误的,表单控件的内容存在value属性中,应修改为:

const values = document.querySelectorAll('[name]');
values.forEach( value => {
  value.value = ''; // 改为操作value属性
});

内容的提问来源于stack exchange,提问作者Andrew Buccellato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 09:07:41