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

如何在中间件中调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:35:20