有没有办法检查req.body是否仅包含一组参数

时间:2019-09-18 11:27:23

标签: express-validator

我正在使用express-validator中间件来验证请求正文对象,假设我希望正文为

{
"username":"",
"email":""
}

是否有一种方法可以确保主体不包含其他键 例如:如果身体是

{
"username":"",
"email":"",
"otherKey":""
}

我希望它被拒绝

1 个答案:

答案 0 :(得分:0)

请让我们知道您做了什么

首先,您需要分享您到目前为止所做的工作,以便我们不会完全依靠自己解决问题,而是为您指明正确的方向。

解决方案+说明

好的,这是一些棘手的解决方案。我认为您需要同时执行以下操作:

  1. 验证2个必要参数,usernameemail
  2. 检查请求正文中是否没有其他键。

使用不带参数的body()可以验证整个 body 对象。

有关此信息,Whole body validation

下面列出的代码是API端点POST /login的示例,它可以满足您的需求。请参考中间件数组(body().custom(...))中的第三个验证器。

const { Router } = require('express');
const router = Router();
const { body, validationResult } = require('express-validator');

router.post('/login', [
    body('username').isString().not().isEmpty(),
    body('email').isEmail(),
    body().custom(body => {
        const keys = ['username', 'email'];
        return Object.keys(body).every(key => keys.includes(key));
    }).withMessage('Some extra parameters are sent')
], (req, res, next) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) return res.status(422).send(errors.array({ onlyFirstError: true }))
    next();
}, (req, res) => {
    //some other stuff
    res.status(200).send("OK")
});

您也可以用第三个验证器代替:

body().custom((body, { req }) => {
   const keys = ['username', 'email'];
   return Object.keys(req.body).every(key => keys.includes(key));
}).withMessage('Some extra parameters are sent')

唯一的区别是,在这种情况下,您使用req对象,您可以始终在所有custom()验证器中获取该对象。此处介绍了此功能:Custom validation

  

接收要验证的字段的值,以及快递请求,位置和字段路径。

结果

在这里,我想分享一些显示/login端点行为的屏幕截图:

  1. No data was sent in request body;
  2. Request body is (also) filled with unwanted keys;
  3. Request body is filled correctly