簡體   English   中英

如何從中間件 function 調用 express-validator?

[英]How to call express-validator from middleware function?

我一直在努力從middleware function 調用express-validator function。我可以看到執行很高興express-validator但沒有任何驗證。 下面是代碼片段:

router.get("/v2/course/poc", Policy.hybridPolicy, V2manageCourse.validatePOC)

Policy.js


const { basicValidations } = require("../../utils/common");

class Policy {
    constructor(req, res, next) {
        this.req = req;
        this.res = res;
        this.next = next;
    }

    static hybridPolicy = async (req, res, next) => {
        try {
            log.info("hybridPolicy check")

            await schema.validation(req, res)
            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));
        }
    }

}

module.exports = Policy

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.export = {
  validate
}

schemavalidationCheck.js

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 new Error({
        errors: extractedErrors,
    })
    // return next(res.status(422).json({
    //     errors: extractedErrors,
    // }))
}

module.exports = {
    validate
}

我在其中使用return()而不是next() ,因為我想在調用next()之前檢查所有驗證。 有人知道為什么 express-validator 無法檢查嗎?

在你的 catch 塊中,你不應該調用:

next(ApiError.unAuthorize(e.message));

相當:

try {
   ...
} catch(e) {
   res.send(ApiError.unAuthorize(e.message));
   log.error("Error occured during hybrid policy check", e.message);
}

或者,如果您在捕獲中間件時出錯,您可以簡單地執行以下操作:

try {
   ...
} catch(e) {
   throw new Error(ApiError.unAuthorize(e.message));
}

在您的錯誤中間件中,您可以適當地處理。 請參閱https://expressjs.com/en/guide/error-handling.html以供參考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM