【问题标题】:Express JS form validation with hapi/Joi doesn't validate form data correctly使用 hapi/Joi 的 Express JS 表单验证无法正确验证表单数据
【发布时间】:2019-05-03 20:46:21
【问题描述】:

我有一个表单,我正在尝试使用 hapi/Joi 包进行验证,但它不从表单中获取值。相反,它返回第一个验证错误,因为所有模式键都采用“未定义”的值。我怎么解决这个问题?还有一种方法可以在不刷新 Express 页面的情况下向用户打印错误吗?如果是,请告诉我。

我的快递代码:

const express = require('express');
const app = express();
const path = require('path');
const bodyParser = require('body-parser');
const Joi = require('@hapi/joi');
const uuidv4 = require('uuid/v4');

app.set('view engine','ejs');

const urlEncodedParser = app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());

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

app.get('/',(req,res)=>{
    res.render('main');
});

const schema = Joi.object().keys({
    name: Joi.string().min(3).required(),
    surname: Joi.string().min(5).required(),
    age: Joi.number().integer(),
    email: Joi.string().email({minDomainSegments: 2}).required(),
    password: Joi.string().min(3).required(),
    confirm: Joi.any().valid(Joi.ref('password'))
});

app.post('/register',(req,res)=>{
    req.body.id = uuidv4();
    console.log(req.body);
    const result = Joi.validate({

        name: req.body.name,
        surname: req.body.surname,
        age: req.body.age,
        email: req.body.email,
        password: req.body.password,
        confirm: req.body.confirm

    }, schema,(error,value)=>{
        if(error){

            printError(error);

        }
        else{
            console.log('success');
        }
    });

});

function printError(error){
    console.log(error);
}

app.listen(3000);

我的表格:

<form action="/register" method="POST" enctype="multipart/form-data">

        <input type="text" name='name' class="form-control" value="">
        <input type="text" name='surname' class="form-control" value="">
        <input type="number" name='age' class="form-control" value="">
        <input type="email" name='email' class="form-control" value="">
        <input type="password" name='password' class="form-control">
        <input type="password" name='confirm' class="form-control">
        <input type="submit" class="btn btn-block btn-success" value="OKAY">

    </form>

我得到的错误:

{ ValidationError: child "name" fails because ["name" is required]
    at Object.exports.process (C:\xampp\htdocs\express+mongo\node_modules\@hapi\joi\lib\errors.js:202:19)
    at internals.Object._validateWithOptions (C:\xampp\htdocs\express+mongo\node_modules\@hapi\joi\lib\types\any\index.js:763:31)
    at module.exports.internals.Any.root.validate (C:\xampp\htdocs\express+mongo\node_modules\@hapi\joi\lib\index.js:145:23)
    at app.post (C:\xampp\htdocs\express+mongo\index.js:31:24)
    at Layer.handle [as handle_request] (C:\xampp\htdocs\express+mongo\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\xampp\htdocs\express+mongo\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\xampp\htdocs\express+mongo\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\xampp\htdocs\express+mongo\node_modules\express\lib\router\layer.js:95:5)
    at C:\xampp\htdocs\express+mongo\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (C:\xampp\htdocs\express+mongo\node_modules\express\lib\router\index.js:335:12)
  isJoi: true,
  name: 'ValidationError',
  details:
   [ { message: '"name" is required',
       path: [Array],
       type: 'any.required',
       context: [Object] } ],
  _object:
   { name: undefined,
     surname: undefined,
     age: undefined,
     email: undefined,
     password: undefined,
     confirm: undefined },
  annotate: [Function] }

即使我在表单中填写姓名输入并按回车,它也会显示“需要姓名”。

【问题讨论】:

  • 我看不到你的console.log(req.body)返回了什么,也不再需要body-parser,express 4+带有内置的body-parser。
  • 我刚刚检查过,它似乎没有返回任何东西。

标签: javascript express ejs


【解决方案1】:

改变

const urlEncodedParser = app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());

到

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-09-24
  • 2013-10-19
  • 2015-07-01
  • 1970-01-01
  • 2019-10-10
  • 2020-09-19
  • 2022-08-09
  • 2020-05-30
相关资源
最近更新 更多