express-validator 4.3新写法验证逻辑不触发问题求助
解决新版express-validator验证逻辑不触发的问题
嘿,我来帮你排查下问题所在,主要有几个关键点导致你的验证逻辑没触发:
1. 验证规则选错了:exists() vs notEmpty()
你新版代码里用了exists(),但这个方法只是检查字段是否存在(哪怕字段值是空字符串也会通过),而旧版的notEmpty()是检查字段值不为空——这才是你需要的核心逻辑!
比如用户提交一个空的titulo字段,exists()会认为字段存在,不会报错;但notEmpty()会拦截这个空值,生成你设置的错误提示。
2. 错误对象处理和模板渲染不匹配
- 你用了
erros.mapped()返回一个以字段名为键的对象,但前端模板里却用erros[0]这种数组索引去取值,肯定拿不到错误信息。 - 另外,你渲染的模板是
admin/form_corrige_noticia,但用户访问的表单是form_add_noticia,这会导致错误信息出现在另一个模板里,你自然看不到验证触发的效果。
修正后的完整代码
后端代码(匹配旧版验证逻辑)
// 注意:新版express-validator的导入路径简化了,不需要/check子路径 const { check, validationResult } = require('express-validator'); module.exports = (express) => { express.get('/add-noticias', (req, resp) => { // 初始化空的验证对象,避免模板报错 resp.render('admin/form_add_noticia', { validacao: [], validacaoObj: {} }) }) express.post('/noticias/salvar', [ // 替换exists()为notEmpty(),和旧版逻辑完全一致 check('titulo', 'O titulo é necessário').notEmpty(), check('noticia', 'O que você quer cadastrar mesmo?').notEmpty(), check('resumo', 'Toda notícia precisa de um resumo!').notEmpty(), check('autor', 'Quem escreveu esse artigo?').notEmpty(), check('data_noticia', 'Quando foi que isso ocorreu??').notEmpty() ], (req, resp) => { const erros = validationResult(req); if (!erros.isEmpty()) { // 两种错误格式可选:数组(适合批量显示)或对象(适合单个字段显示) const errosArray = erros.array(); const errosObj = erros.mapped(); console.log('错误数组:', errosArray); console.log('错误对象:', errosObj); // 渲染原来的表单模板,传递两种格式的错误信息 return resp.render('admin/form_add_noticia', { validacao: errosArray, validacaoObj: errosObj }); } // 验证通过后的逻辑:比如保存到数据库 // conteudo = req.body; // noticiasModel.salvar(conteudo, (erro, resultado) => { ... }) }) }
前端模板(支持批量+单个字段错误提示)
<!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="utf-8"/> <title>Formulário de cadastro de Notícias</title> <style> .error { color: #dc3545; margin: 5px 0; } </style> </head> <body> <h1>Adicionar notícia</h1> <!-- 批量显示所有错误 --> <% if (validacao.length > 0) { %> <ul class="error"> <% validacao.forEach(erro => { %> <li><%= erro.msg %></li> <% }) %> </ul> <% } %> <form action="/noticias/salvar" method="post"> <label>Título da notícia</label> <input type="text" name="titulo" id="titulo"> <!-- 单个字段的错误提示 --> <% if (validacaoObj.titulo) { %> <p class="error"><%= validacaoObj.titulo.msg %></p> <% } %> <br> <label>Notícia</label> <textarea type="text" cols="30" rows="5" id="noticia" name="noticia"></textarea> <% if (validacaoObj.noticia) { %> <p class="error"><%= validacaoObj.noticia.msg %></p> <% } %> <br> <label> Resumo da Notícia</label> <textarea type="text" cols="30" rows="5" id="resumo" name="resumo"></textarea> <% if (validacaoObj.resumo) { %> <p class="error"><%= validacaoObj.resumo.msg %></p> <% } %> <br> <label>Autor</label> <input type="text" id="autor" name="autor"> <% if (validacaoObj.autor) { %> <p class="error"><%= validacaoObj.autor.msg %></p> <% } %> <br> <label>Data da Notícia</label> <input type="date" id="data_noticia" name="data_noticia"> <% if (validacaoObj.data_noticia) { %> <p class="error"><%= validacaoObj.data_noticia.msg %></p> <% } %> <br> <button type="submit">Enviar</button> </form> </body> </html>
为什么原来的代码不触发验证?
exists()的逻辑不符合需求:只要表单字段存在(哪怕是空值),exists()就会通过验证,不会生成错误,导致!erros.isEmpty()为false,无法进入错误处理块。- 模板渲染路径错误:你渲染的是
form_corrige_noticia,但用户操作的是form_add_noticia,错误信息根本没显示在当前页面。 - 错误对象格式不匹配:
mapped()返回的是对象,你用数组索引去取值,自然拿不到内容,看起来像是验证没生效。
这样修改后,就能和旧版代码的验证逻辑完全一致,同时符合新版express-validator的规范啦!
内容的提问来源于stack exchange,提问作者Pedro_Sousa
相关产品推荐
相关产品推荐

