Express创建用户POST请求提示username值为undefined如何解决
问题原因
1. 中间件注册顺序错误(核心问题)
express-validator 依赖body-parser解析后的请求体参数,你现在把app.use(expressValidator())写在了body-parser的注册逻辑之前,此时请求体还没有被解析,req.body是空对象,所以校验的时候拿不到username、password等参数,才会返回value: undefined的错误。
2. 校验规则笔误(次要问题)
createUserForm回调函数中,password2的校验提示和逻辑不匹配,当前写的是req.checkBody('password2', 'UserName is required').equals(req.body.password);,提示文案不符合校验逻辑,属于可修复的笔误。
解决方案
第一步:调整中间件顺序
修改app.js中的代码,把express-validator的注册逻辑移到body-parser之后,调整后代码如下:
const express = require('express'); const dotenv = require('dotenv'); const app = express(); //main app variable that represents the application const morgan = require('morgan'); const bodyparser = require("body-parser"); //requiring the body parser const path = require('path'); const expressValidator = require('express-validator'); const bycrypt = require('bcryptjs'); //require the monogo db file const connectDB = require('./server/database/connection'); dotenv.config({ path: 'config.env' }); //for the port variable const PORT = process.env.PORT || 8080; //requiring morgan file //to log the request app.use(morgan('tiny')); // mongo db connection connectDB(); //to show >> req.body app.use(bodyparser.json()); app.use(bodyparser.urlencoded({ extended: true })); // 把expressValidator注册移到body-parser之后 app.use(expressValidator())
第二步:修正校验规则笔误
修改createUserForm函数中password2的校验规则:
// 修改前 // req.checkBody('password2', 'UserName is required').equals(req.body.password); // 修改后 req.checkBody('password2', '确认密码与密码输入不一致').equals(req.body.password);
第三步(可选验证)
如果调整完还是报错,可以在createUserForm函数最开头加一行console.log(req.body),看控制台打印的请求体是否包含username等表单提交的参数,确认参数传递链路正常。
内容的提问来源于stack exchange,提问作者Hesham Eldawy
相关产品推荐
相关产品推荐

