我正在使用express-validator中间件来验证请求正文对象,假设我希望正文为
{
"username":"",
"email":""
}
是否有一种方法可以确保主体不包含其他键 例如:如果身体是
{
"username":"",
"email":"",
"otherKey":""
}
我希望它被拒绝
答案 0 :(得分:0)
首先,您需要分享您到目前为止所做的工作,以便我们不会完全依靠自己解决问题,而是为您指明正确的方向。
好的,这是一些棘手的解决方案。我认为您需要同时执行以下操作:
username
和email
; 使用不带参数的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
端点行为的屏幕截图: