【问题标题】:Custom validator on object in express-validation快速验证中对象的自定义验证器
【发布时间】:2020-09-01 08:03:21
【问题描述】:

问题

自定义验证器没有给出任何响应。我想在 express-validator 中验证下面的对象。特权密钥必须有效并且存在于我的数组中。如果特权对象不存在,则验证不起作用,因为它是可选的,但如果对象存在,则值必须有效

{

"email" : "john@gmail.com",
"privileges" : {
    "topic" : true
  }

}

user.js

 const User = require('../../models/User');
 const { check, validationResult } = require('express-validator');

 let privilegesArray = ['topic'];

 router.post(
 '/',
 [

   check("privileges")
  .custom(async (value, { req }) => {
   Object.keys(value).forEach(function(key){
   if(!privilegesArray.includes(key)){
      return false;
      }
   if(value[key] === 'true' || value[key] === 'false' || value[key] === ''){
      return false;
      }
   })
  }).withMessage("Invalid privileges").optional({checkFalsy: true})

],
 async (req, res) => {
 const errors = validationResult(req);
 if (!errors.isEmpty()) {
  return res.status(400).json({ errors: errors.array() });
 }

}
);

我是 node-js 的初学者,没有使用任何自定义验证器。

【问题讨论】:

    标签: javascript node.js express validation express-validator


    【解决方案1】:

    好的,所以您的脚本几乎没有问题:

    1. 在自定义处理程序中,您正在使用 forEach 进行迭代:

      Object.keys(value).forEach(function(key){
          if(!privilegesArray.includes(key)){
             return false;
      

      但是,问题是您从内部 forEach 处理程序中返回 false,而不是 custom 处理程序本身。

    2. 根据documentation,你不应该顺便回来。你应该抛出一个错误。

    3. 如果一切顺利,您没有提供处理程序,例如。 return res.status(200).json({ errors: "[]" }); 以防路由处理程序一切正常。

    4. 最重要的我猜,你没有注册任何bodyParser。我很确定 express 无法理解 POST 正文中的 application/json:app.use(bodyParser.json());

    5. 在中间件解析输入 json 之后,您不应该比较 value[key] === 'true',因为它将是布尔值 true

    以下是似乎符合您要求的完整代码,使用 fiddler 进行了测试:

    const { check, validationResult } = require("express-validator");
    const bodyParser = require("body-parser");
    const express = require("express");
    const app = express();
    const port = 3000;
    let privilegesArray = ["topic"];
    app.use(bodyParser.json());
    app.post(
      "/",
      [
        check("privileges")
          .custom(async (value, { req }) => {
            var keys = Object.keys(value);
            for (var k = 0; k < keys.length; k++) {
              var key = keys[k];
              if (!privilegesArray.includes(key)) continue;
              if (
                value[key] !== true &&
                value[key] !== false &&
                value[key] !== ""
              ) {
                throw new Error("Topic is invalid.");
              }
            }
            return true;
          })
          .withMessage("Invalid privileges")
          .optional({ checkFalsy: true }),
      ],
      async (req, res) => {
        const errors = await validationResult(req);
        console.log(errors);
        if (!errors.isEmpty()) {
          return res.status(400).json({ errors: errors.array() });
        }
        return res.status(200).json({ errors: "[]" });
      }
    );
    
    app.listen(port, () => {
      console.log(`Example app listening at http://localhost:${port}`);
    });
    

    【讨论】:

    • 我还想检查密钥是否存在于我的特权数组中。如果不是,那么我将抛出这样的错误 ** if (!privilegesArray.includes(key)) throw new Error("Invalid topic key")**;好吗?
    • 感谢您的努力和时间。这就是我想要的(Y)
    • 当然,你会抛出一个错误,而不是continue
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多