当前位置: 首页 > 面试题库 >

快速验证器v4的检查功能中的访问请求正文

郁光熙
2023-03-14
问题内容

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

在较早的版本中,您只是在主体解析器之后的某处在app.js中添加了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比较两个不同的字段?首先十分感谢!


问题答案:

摆弄了一段时间后,我找到了一种使用自定义验证器来实现此目的的方法。传递给定制方法的验证器函数接受包含请求主体的对象:

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
    });


 类似资料:
  • 我们正在使用JAX RS为我们的一个项目实现一个REST API。要求是用户将以JSON格式传入请求对象。 让我们假设我们有一个在命中APIendpoint时调用的方法 示例请求对象: { “firstName”:“Test”, “lastName”:“Name”, “sno”:“A123” } 吸气剂和setter 现在,如果用户尝试向上面给出的请求对象添加其他参数(例如:“age”)并调用ap

  • 问题内容: 我想检查我的客户请求的类型是JSON还是HTML,因为我希望自己的路线能够同时满足人和机器的需求。 我在以下位置阅读了Express 3文档: http://expressjs.com/api.html 有两种方法和,使用方法如下: 要么 由于这些无法正常工作,因此我尝试使用: 要么 总是… 也不起作用。我究竟做错了什么? 编辑1 :我已经检查了正确的客户端HTML协商。这是我的两个不

  • 我有一个方法可以创建一个带有节点和关系的图。我想将节点ID列表返回给调用方,以便后面的步骤可以快速定位这些节点并创建其他关系。我将无法返回节点实例。 在SQL世界中,我可以返回主键或唯一键。在neo4j的世界里,我应该回报什么?是否有一个唯一的节点标识符,我可以使用,而不会注定自己的地狱第七级?我有自己的身份证吗?由于我沉迷于SQL,我在学习Neo4J方法时遇到了困难。

  • 我正在使用Spring Integration Filter对传入消息强制执行一些验证逻辑。验证的结果需要发回消息网关调用方,以便通知请求的具体错误。 null 配置 网关 过滤器

  • 这是我的视图代码: 和请求验证程序: 发送post请求以创建方法后,它将 SQLSTATE[42S22]:找不到列: 1054未知列'article.title'in'where cluse' SQLSTATE[42S22]:未找到列:“where子句”中的1054未知列“article.title”(SQL:选择count(*)作为来自的聚合,其中title=test) 更新 这是我的控制器代码

  • 我有一个设置为接收来自WooCommerce的网络钩子的Rails应用程序。具体来说,我正在寻找创建订单的时间。我已经测试并验证了它在我protect_from_forgery时是否有效,除了创建。现在我正在尝试通过验证网络钩子来保护我的应用程序。WooCommerce的留档声明在请求标头中传递以下秘密: 秘密:一个可选的密钥,用于生成请求正文的HMAC-SHA256哈希,以便接收者可以验证Web