0

我认为这很简单,但我感觉将自定义验证器与现有验证器链接会导致 req 对象发生一些奇怪的事情,这似乎是未定义的:

req.checkBody('Game18awayScore', 'must be between 0 and 30').isInt({min:0, max:30}).custom((value,{ req }) => {
        console.log(something);
        if (Math.abs(value - req.body.Game18homeScore) < 2){
          if (value < 30 && req.body.Game18homeScore < 30){
            throw new Error("winning score isn't 2 greater than losing score");
          }
        }
      });
      req.checkBody('homeMan1', 'Please choose a player.').notEmpty().custom((value,{req}) => {
        if (value != 0){
          if (value == req.body.homeMan2 || value == req.body.homeMan3 || value == req.body.awayMan1 || value == req.body.awayMan2 || value == req.body.awayMan3){
            throw new Error("can't use the same player more than once")
          }
        }

      });

但我只是不断得到: TypeError: Cannot destructure propertyreqof 'undefined' or 'null'.

第一个习惯是检查两个值之间是否存在至少两个差异,除非其中一个值是 30。

第二个习惯是检查一个值没有在其他 5 个选项中使用。

我应该补充一点,这段代码在验证器函数中:

function validateScorecard (req,res,next){ [all my validations for the form including the ones above] }

然后将其包含在路线中: app.post('/scorecard-beta',validateScorecard, fixture_controller.full_fixture_post);

有任何想法吗?

4

1 回答 1

1

当您使用旧版 API(例如).custom()时,用于指定这样的内联验证器不起作用。req.checkBody(...).custom()

多年来,遗留 API 以一种完全不同的方式支持自定义验证器:
您将它们指定为 express-validator 中间件中的选项,并且在您使用req.checkBody(...).
然后这些可以接收除字段值之外的其他参数。

例子:

app.use(expressValidator({
    customValidators: {
        isMagicNumber(value, additionalNumbers) {
            return value === 42 || additionalNumbers.includes(value);
        }
    }
}));

app.post('/captcha', (req, res, next) => {
    // world's safest captcha implementation
    req.checkBody('answer').isMagicNumber();
    req.checkBody('answer').isMagicNumber([req.user.age]);
});

调用有点工作,.custom()因为方法在那里,但在遗留 API 内部,express-validator 不知道你是如何定义它的。

你的解决方案?

于 2018-11-05T05:18:24.780 回答