Express Validator:验证器函数的参数传递机制问询
在Express Validator中,参数是如何传递给验证器中间件的?
咱们一步步拆解这个问题,结合你给出的示例代码来解释:
首先,先明确核心逻辑:check('字段名')的作用是创建一个「验证链」,它会告诉后续的验证规则要从请求对象(req)里提取哪个字段来校验。
具体的传递和执行流程:
创建验证链,标记目标字段
当你调用check('programming_language')时,这个函数会生成一个验证链实例,它会记住你要校验的字段名称是programming_language。后续的.isIn(['javascript', 'java', 'php'])是给这个验证链添加具体的校验规则。中间件执行时自动提取字段值
当这个验证链被放进oneOf或者直接作为路由中间件时,请求到达路由后,Express会先执行这些验证中间件:- 验证器会自动从
req的三个位置查找目标字段:req.body(POST请求的表单/JSON参数)、req.query(URL查询参数)、req.params(路由参数) - 找到对应字段的值后,会把这个值传递给之前定义的校验规则(比如
isIn)进行检查 - 校验的结果(通过/失败、错误信息等)会被悄悄存在
req的一个隐藏属性里,等后续用validationResult(req)来提取
- 验证器会自动从
结合你的示例代码来看:
在你给出的POST路由里:
const { check, oneOf, validationResult } = require('express-validator/check'); app.post('/start-freelancing', oneOf([ check('programming_language').isIn(['javascript', 'java', 'php']), check('design_tools').isIn(['photoshop', 'gimp']) ]), (req, res, next) => { try { validationResult(req).throw(); // yay! we're good to start... } catch (err) { // 处理验证错误 } });
check('programming_language')会在请求进来时,从req.body(因为是POST请求,参数通常在这里)取出programming_language的值,然后用isIn规则校验它是否在指定数组里oneOf的作用是只要两个验证链中有一个通过,就认为整体校验合格- 最后
validationResult(req)会从req里取出所有校验结果,判断是否有错误
额外补充:指定字段来源
如果你想明确限定只从某个位置取字段(比如只从req.body里找),可以用body('programming_language')、query('参数名')、params('路由参数名')这些方法,它们是check的语法糖,本质逻辑和check一致,只是缩小了查找范围。
内容的提问来源于stack exchange,提问作者Humoyun Ahmad
相关产品推荐
相关产品推荐

