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

Express Validator失效:始终返回value:undefined, msg:'Invalid value'求助

问题排查与解决

核心错误原因

你在使用express-validator的check方法时参数传入错误:

check('req.body.aName') // 错误写法

check方法默认会从req.body中匹配对应字段,只需传入字段名即可,不需要带req.body前缀。写成req.body.aName会让验证器去req.body里查找名为req.body.aName的键,这个键不存在,所以始终返回value:undefined的错误。

额外注意事项

  1. 确保Express应用已配置JSON请求体解析中间件:
app.use(express.json());

你提到console.log(req.body.aName)能正常输出,说明该中间件已配置,但如果后续出现req.body为空的情况,优先检查此项。

  1. 你的自定义错误格式化器仅返回myLocation,建议补充错误信息和字段名,方便调试:
formatter: error => {
    return {
        myLocation: error.location,
        msg: error.msg,
        param: error.param
    };
}

修正后的服务端代码

const { validationResult, check } = require('express-validator');
const express = require('express');
const app = express();

// 必须配置该中间件才能解析JSON请求体
app.use(express.json());

const myValidationResult = validationResult.withDefaults({
    formatter: error => {
        return {
            myLocation: error.location,
            msg: error.msg,
            param: error.param
        };
    },
});

app.post("/pathToContactTable", 
    [
        check('aName') // 修正:直接传入字段名
        .not().isEmpty().withMessage('姓名不能为空') // 可添加自定义错误提示
    ],
    async (req, res, next) => {
        console.log(req.body.aName);
        
        const err = myValidationResult(req);

        console.log(!err.isEmpty());

        if (!err.isEmpty()) {
            console.log(err.mapped())
            return res.status(400).json({errors: err.array() });
        } else {
            try {
                const { aName, aLastName, aPhone, aEmail, job1, jobDesc1, job2, jobDesc2, job3, jobDesc3, edu, eduYear, certTitle } = req.body;
                const newApplicant = await pool.query(`INSERT INTO applicantContactTable 
                ( applicantName, applicantLastName, applicantPhone, applicantEmail, jobTitle1, jobDesc1, jobTitle2, jobDesc2, jobTitle3, jobDesc3, educationTitle, educationYear, certificationTitle) 
                VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) RETURNING *`,
                    [aName, aLastName, aPhone, aEmail, job1, jobDesc1, job2, jobDesc2, job3, jobDesc3, edu, eduYear, certTitle]
                );
                
                res.json(newApplicant.rows[0]);  
            } catch (err) {
                console.error(err.message);
            }
        }
});

前端代码说明

你的前端逻辑基本正常,需确保aName状态与表单输入值正确绑定(比如在firstNameInput的onChange事件中调用setAName),这样POST请求体才能携带最新的aName值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:56:05