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

Express.js如何实现服务端注册表单必填字段校验

服务端注册表单非空校验实现方案

核心逻辑分三步:配置请求体解析、编写服务端校验规则、修改EJS模板展示自定义错误提示。

  • 第一步:配置Express请求体解析中间件
    要读取表单POST提交的字段,必须先在路由定义前加express.urlencoded中间件,否则req.body会是undefined,无法拿到表单数据:

    const express = require('express')
    const app = express()
    // 配置表单请求体解析,必须放在所有路由定义之前
    app.use(express.urlencoded({ extended: true }))
    app.set('view engine', 'ejs') // 确认已开启EJS模板引擎配置
    
  • 第二步:编写POST /signup路由的校验逻辑
    不需要单独写/error路由,直接在处理注册提交的接口里做字段校验:对每个字段先去除首尾空格再判断是否为空,校验不通过就直接返回注册页+对应错误提示,校验通过再走后续账号创建逻辑,从根源上绕过前端校验的非法请求也会被拦截:

    // 注册页GET路由,首次进入页面无错误信息
    app.get('/signup', (req, res) => {
      res.render('signup', { error: undefined })
    })
    
    // 注册提交POST路由
    app.post('/signup', (req, res) => {
      // 提取表单字段,统一去除首尾空格,兼容字段未传的异常场景
      const name = (req.body.name || '').trim()
      const usr = (req.body.usr || '').trim()
      const psd = (req.body.psd || '').trim()
    
      // 按顺序做非空校验,命中任意规则就返回对应提示
      if (!name) {
        return res.render('signup', { error: '请输入你的姓名' })
      }
      if (!usr) {
        return res.render('signup', { error: '请输入用户名' })
      }
      if (!psd) {
        return res.render('signup', { error: '请输入密码' })
      }
    
      // 所有字段校验通过,再执行后续密码加密、账号入库、注册成功跳转等业务逻辑
      // ...... 你的原有注册业务代码
      res.send('注册成功')
    })
    
  • 第三步:修改signup.ejs模板,展示自定义错误提示
    可以移除input上的原生required属性,避免弹出浏览器默认的提示框;在表单顶部加错误信息渲染逻辑,还可以自定义错误提示的样式匹配网站设计:

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>MVC | Signup</title>
      <style>
        /* 可自定义错误提示样式,匹配站点UI */
        .error-tip {
          color: #f53f3f;
          padding: 8px 12px;
          background: #fff1f0;
          border-radius: 4px;
          margin-bottom: 12px;
        }
        input {
          display: block;
          margin: 8px 0;
          padding: 6px 8px;
        }
      </style>
    </head>
    <body>
        <form action="/signup" method="post" class="w-1/2 flex flex-col" target="nothing">
          <h1 class="text-xl text-center mb-5">Sign up for post-it</h1>
          <!-- 错误提示渲染逻辑 -->
          <% if (typeof error !== 'undefined' && error) { %>
            <div class="error-tip"><%= error %></div>
          <% } %>
          <input type="text" name="name" placeholder="Your name">
          <input type="text" name="usr" placeholder="Username">
          <input type="password" name="psd" placeholder="Password">
          <button type="submit">Sign up for post-it</button>
        </form>
        <iframe name="nothing" style="display: none"></iframe>
    </body>
    </html>
    

补充说明:如果需要更流畅的交互,可以自行编写JS监听表单submit事件做前端实时校验,但服务端校验必须保留——所有前端校验都可以通过抓包、修改页面源码、构造请求等方式绕过,服务端校验才是数据安全的核心防线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:12:32