如何在中间件中调用express-validator?验证未生效问题求助
问题分析与解决方案
你遇到的express-validator不生效问题,核心原因是验证规则未被正确执行,结合你的代码,有几个关键错误需要修正:
1. schema.js导出语法错误
你的schema.js里使用了错误的导出语法module.export,正确写法应为module.exports,否则外部无法正确导入validate函数,导致验证规则根本没被加载。
修正后的schema.js:
const { body, query } = require("express-validator"); const validate = (method) => { switch (method) { case "getCourseById": { return [ query("courseid") .exists() .isMongoId() .withMessage("courseid must be mongoId") .not() .isEmpty() .withMessage("courseid can not be empty and must be a MongoId"), ]; } } } module.exports = { // 修正导出语法 validate }
2. 验证规则未被正确触发
express-validator的验证规则是中间件数组,不能直接通过schema.validation(req, res)调用,需要用run(req)方法触发每个规则的验证逻辑,同时要传入对应的method参数匹配规则。
修改Policy.js里的调用代码:
static hybridPolicy = async (req, res, next) => { try { log.info("hybridPolicy check") // 1. 获取对应验证规则数组 const validationRules = schema.validate("getCourseById"); // 2. 逐个执行验证规则 await Promise.all(validationRules.map(rule => rule.run(req))); await schemaValidationCheck.validate(req, res); next(); } catch (e) { console.log("hybridPolicy: ", e) log.error("Error occured during hybrid policy check", e.message) return next(ApiError.unAuthorize(e.message)); } }
3. 错误抛出逻辑优化(可选)
在schemavalidationCheck.js里,throw new Error({ errors: extractedErrors })会把对象转为字符串"Error: [object Object]",导致错误信息丢失,建议改为直接抛出错误对象:
const { validationResult } = require('express-validator') const validate = async (req, res) => { const errors = validationResult(req) console.log(errors) if (errors.isEmpty()) { return; } const extractedErrors = [] errors.array().map(err => extractedErrors.push({ [err.param]: err.msg })) // 直接抛出包含错误信息的对象 throw { errors: extractedErrors, } } module.exports = { validate }
额外注意
确认你的路由/v2/course/poc确实需要验证courseid查询参数,且schema里的getCourseById规则与该路由匹配,若路由对应其他验证规则,需调整schema.validate()的传入参数。
内容的提问来源于stack exchange,提问作者justAnAnotherCoder
相关产品推荐
相关产品推荐

