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

Custom validator on object in express-validation

问题

自定义验证器未给出任何响应。我想在 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 的初学者,没有使用任何自定义验证器。

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

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