快速验证中对象的自定义验证器

问题描述

问题

自定义验证器未给出任何响应。我想在 express-validator 中验证以下对象。特权密钥必须有效并且存在于我的阵列中。如果特权对象不存在,则验证无效,因为它是可选的,但如果对象存在,则该值必须有效

def prime_max(x):
a = x
i = 2
while i in range(2,int(a+1)):
    if a%i == 0:
        a = a/i
        
        if a == 1:
             print(i)
        i = i-1
    i = i+1       

user.js

{

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

}

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

解决方法

好的,因此您的脚本几乎没有问题:

  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

下面是看似符合您要求的完整代码,已使用提琴手进行了测试:

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...