首页 > 解决方案 > 使用 EJS 模板引擎在 Node.js 中提交表单后,我不断收到验证器错误

问题描述

当我使用 Postman 发出请求时,代码运行良好且完美。但是每当我从前端发送相同的请求时,我都会收到此错误。

Result {
  formatter: [Function: formatter],
  errors: [
    {
      value: undefined,
      msg: 'Please enter your name',
      param: 'name',
      location: 'body'
    },
    {
      value: '',
      msg: 'Please enter a valid Email',
      param: 'email',
      location: 'body'
    },
    {
      value: undefined,
      msg: 'Please enter a password with 6 or more characters',
      param: 'password',
      location: 'body'
    }
  ]
}

这是我的 signup.ejs 文件。

<!doctype html>
<html lang="en">
  <%- include('./partials/header.ejs')%>
  <%- include('./partials/navbar.ejs')%>
  <body>
    <section class="form my-4 mx-5">
      <div class="container">
        <div class="row no-gutter">
          <div class="col-lg-5">
            <img src="/images/joyce-busola-Nnv0DHFG1Ds-unsplash.jpg" class="img-fluid">
          </div>
          <div class="col-lg-7 px-5 pt-5">
            <h1 class="font-weight-bold py-3">Queue's</h1>
            <h4>Register your new Account</h4>
            <form action="/user/register" method="POST">
              <div class="form-row">
                <div class="col-lg-7">
                  <input type="text" id="name" class="form-control my-3 p-3" placeholder="your name">
                </div>
              </div>

              <div class="form-row">
                <div class="col-lg-7">
                  <input type="email" id="email" class="form-control my-3 p-3" placeholder="email address">
                </div>
              </div>

              <div class="form-row">
                <div class="col-lg-7 input-group">
                  <input type="password" class="form-control my-3 p-3" id="password" placeholder="password">
                  <div class="input-group-addon my-3 p-3">
                    </a><i class="bi bi-eye-slash" id="togglePassword"></i>
                  </div>
                </div>
              </div>
            

              <div class="form-row">
                <div class="col-lg-7">
                  <button type="submit" class="btn1 mt-3 mb-5">Register</button>
                </div>
              </div>
              <a href="#">forgot password</a>
              <p>Already have an acount? <a href="/user/login">Login here</a></p>
            </form>
          </div>
        </div>
      </div>
    </section>
    <%- include('./partials/footer.ejs')%>  
  </body>
</html>

这是我的注册控制器对象的副本。

require('dotenv').config();
const jwt = require('jsonwebtoken');
const User = require('../models/User');
const { createToken } = require('../middleware/auth_middleware');
const maxAge = 36000;
module.exports.register_post =  async (req, res) => {
  const { name, email, password } = req.body;
  // Searching if User already exists
  try {
    let user = await User.findOne({ email });
    if(user) return res.status(400).json({ errors : [{ msg: "User already exists"}],});

    // Create User Object
    user = new User({ name, email, password });

    // Saving new User
    await user.save();

    // Creating User token with JWT 
    let payLoad = user._id;
 
    const prize = createToken(payLoad);
    res.cookie('jwt', prize, {
      httpOnly: true,
      maxAge : maxAge * 1000
    });

    res.status(201).json({ 
      msg: `${user.email} successfully registered`,
      name: user.name,
      email: user.email});  

      console.log(user, prize);
  } 
  catch (error) {
      console.log(error.message);
      res.status(500).send('Server error')
    };    
}

我制作了一个中间件来使用 express-validator 处理验证。这是验证器文件。

require('dotenv').config()
const { check, validationResult } = require('express-validator');
const jwt = require('jsonwebtoken');
const maxAge = 36000;
const secret = process.env.JWT_SECRET;

const authValidator = () => {
  return [
  check('name', 'Please enter your name').not().isEmpty(),
  check('email', 'Please enter a valid Email').trim().isEmail(),
  check('password', 'Please enter a password with 6 or more characters').isLength({min:6})
]};

const validateError = (req, res, next) => {
const errors = validationResult(req);
if(errors.isEmpty()) {
  return next()
}
const extractedErrors = [];
errors.array().map(err => extractedErrors.push({ [err.param]: err.msg }))

console.log(errors);

return res.status(400).json({ errors: extractedErrors })
}

这是注册路由器文件

const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');
const { authValidator, validateError } = require('../middleware/auth_middleware');

router.get('/login', userController.login_get );
router.post('/login', userController.login_post );

router.get('/register', userController.register_get );
router.post('/register', authValidator(), validateError, userController.register_post );

module.exports = router;

标签: node.jsexpressmongooseejs

解决方案


您的输入字段缺少该name字段。这就是为什么在请求正文中找不到输入数据的原因。

例如对于电子邮件字段:

<div class="form-row">
   <div class="col-lg-7">
       <input type="email" name="email" id="email" class="form-control my-3 p-3" placeholder="email address">
    </div>
</div>

推荐阅读