【问题标题】:Access request body in check function of express-validator v4express-validator v4检查功能中的访问请求体
【发布时间】:2017-09-02 07:36:56
【问题描述】:

我刚开始使用 express.js 和 express-validator 来验证一些输入数据,但在 4.0.0 版中引入的新检查 API 中访问请求正文时遇到问题。

在旧版本中,您只需在 app.js 中的 body-parser 之后的某个位置添加 express-validator 作为中间件:

// ./app.js
const bodyParser = require("body-parser");
const expressValidator = require("express-validator");

const index = require("./routes/index");

const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(expressValidator());

然后在我的索引路由中,我可以检查 post 方法的最终回调函数中的字段。

// ./routes/index.js
const express = require("express");
const router = express.Router();

router.post("/submit", (req, res, next) => {
    // check email
    req.check('email','Invalid email address').isEmail()
    // check if password is equal to password confirmation
    req.check('password', 'Invalid password')
    /* Access request body to compare password 
    field with password confirmation field */
    .equals(req.body.confirmPassword)

    // get errors
    const errors = req.validationErrors();

    // do stuff
});

就像在这个例子中一样,我可以很容易地检查我的密码字段和我的表单的密码确认字段的值是否相等。然而,从版本 4 开始,他们有一个新的 API,要求您直接在路由器文件中加载 express-validator,并在 post 方法中的最终回调之前将检查函数作为函数数组传递,如下所示:

// ./routes/index.js
const express = require("express");
const router = express.Router();
const { check, validationResult } = require("express-validator/check");

router.post(
    "/submit",
    [
        // Check validity
        check("email", "Invalid email").isEmail(),
        // Does not work since req is not defined
        check("password", "invalid password").isLength({ min: 4 })
        .equals(req.body.confirmPassword) // throws an error
    ],
    (req, res, next) => {
    // return validation results
    const errors = validationResult(req);

    // do stuff
});

这不起作用,因为 req 没有​​定义。所以我的问题是:如何访问check() 链中的请求对象,以将两个不同的字段与新的 express-validator API 进行比较?提前非常感谢!

【问题讨论】:

    标签: javascript node.js express express-validator


    【解决方案1】:

    在摆弄了一段时间后,我找到了一种通过使用自定义验证器来实现这一点的方法。传递给自定义方法的验证器函数接受包含请求正文的对象:

    router.post(
        "/submit",
        [
        // Check validity
        check("email", "Invalid email").isEmail(),
        check("password", "invalid password")
            .isLength({ min: 4 })
            .custom((value,{req, loc, path}) => {
                if (value !== req.body.confirmPassword) {
                    // trow error if passwords do not match
                    throw new Error("Passwords don't match");
                } else {
                    return value;
                }
            })
        ],
        (req, res, next) => {
            // return validation results
            const errors = validationResult(req);
    
            // do stuff
        });
    

    【讨论】:

    • 正是因为这个用例,我选择将 req 传递给 v4 中的自定义验证器 :)
    • 这是什么 express-validator 版本? 4+是什么?谢谢
    • 是的@slevin,是的。
    • 将 return (value === req.body.confirmPassword) 用于替换 if 语句还是应该抛出错误?
    猜你喜欢
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 2021-01-13
    相关资源
    最近更新 更多