在快速验证中将字符串与数组中的值匹配

时间:2016-12-22 18:57:23

标签: node.js validation express

我正在使用express-validator来验证我的API的输入,但是我在理解匹配函数时遇到了一些问题。我基本上需要能够弄清楚一个字符串是否匹配接受值数组中的任何值,如下所示,但它似乎不起作用。有什么建议吗?

var schema = {
  "role": {
    in: 'body',
    matches: {
      options: ["administrator", "editor", "contributor", "user"],
      errorMessage: "Invalid role"
    }
  }
}

req.check(schema)

6 个答案:

答案 0 :(得分:4)

matches.options构造一个正则表达式。您可以将正则表达式作为数组的第一个元素传递。试试这个:

var schema = {
  "role": {
    in: 'body',
    matches: {
      options: [/\b(?:administrator|editor|contributor|user)\b/],
      errorMessage: "Invalid role"
    }
  }
}

答案 1 :(得分:3)

由于这篇文章已经有一段时间了,有些事情发生了变化,我认为是时候进行更新了:

根据express-validator 5.2.0的docs,建议使用以下validating a schema语法(请注意,在 express-validator之前调用bodyparser 非常重要函数名称 checkSchema ):

app.js

const bodyParser = require('body-parser');
const expressValidator = require('express-validator');

/* Initialize/Mount BodyParser for parsing application/x-www-form-urlencoded */
app.use(bodyParser.urlencoded({ extended: false }));

/* Initialize/Mount BodyParser for parsing application/json */
app.use(bodyParser.json());

/* Initialize/Mount Express-Validator for validating user input from the frontend */
app.use(expressValidator());
路线中的

(这是一个寄存器示例):

/* INFO: Require express validator */
const { check, checkSchema, validationResult } = require('express-validator/check');

var Schema = {
  "role": {
    in: 'body',
    matches: {
      options: [/\b(?:administrator|editor|contributor|user)\b/],
      errorMessage: "Invalid role"
    }
  }
}

module.exports = (router) => {
  router.post('/register', [
    // INFO: check validty
    check('username',"Invalid username").isLength({min: 5}),
    check('email',"Invalid  e-mail").isEmail(),
    check('department',"Invalid department").isLength({min: 3}),
    checkSchema(Schema),
    check('password',"Invalid  password").isLength({min: 5})
    ], 

    function(req, res, next) {  
      const errors = validationResult(req);
      if (!errors.isEmpty()) {
         // DO THIS
      }
      else {
         // DO THAT
      }
     });
    return router;
}         

答案 2 :(得分:2)

对我而言,mkhanoyan先生描述的方法没有正常工作,在测试中,我传递了字符串值和其他符号并且它通过了,所以这是错误的beheviour

我设法创建自定义枚举验证器:

req.checkBody('productType').notEmpty().enum(['car', 'tire']);

同样在控制器中,我这样使用它:

gatttool

测试失败了'!car','cahsjhacardasdas'和其他无效输入

答案 3 :(得分:1)

我的做法是使用 isIn()

check('action').isIn(['like', 'dislike']).run(req)

答案 4 :(得分:0)

您也可以使用以下模式:

 var schema = {
  "role": {
    in: 'body',
    isIn: {
      options: [["administrator", "editor", "contributor", "user"]],
      errorMessage: "Invalid role"
    }
  }
}

有关this issue的更多信息。

答案 5 :(得分:0)

以下是我在打字稿中实现的解决方案。

enum RoleOptions {
  client = "CLIENT",
  vendor = "VENDOR",
  operator = "OPERATOR",
  admin = "ADMIN",
  superAdmin = "SUPERADMIN",
}

import express, { Request, Response } from "express";
import { body } from "express-validator";

const router = express.Router();
router.post(
  "/api/updateroles",
  [
    body("roles")
      .notEmpty()
      .isArray()
      .custom((roles) => {
        return roles.every((role: RoleOptions) =>
          Object.values(RoleOptions).includes(role)
        );
      })
      .withMessage("Please provide vaild roles"),
  ],
  async (req: Request, res: Response) => {
    res.status(200).send({ message: "SUCCESS" });
  }
);

export { router as updateRolesRouter };

我们也可以在函数内部使用

async (req: Request, res: Response) => {
    await check('roles').notEmpty().isArray().custom(value=>{
        return value.every((v: RoleOptions)=>Object.values(RoleOptions).includes(v));
    }).run(req);
    res.status(200).send({ message: "SUCCESS" });
}