即使使用express-validator验证1个元素,验证查询参数中数组的所有元素的正确方法是什么?

时间:2019-04-19 17:37:58

标签: express express-validator

使用express-validator5.3.0

我喜欢新语法,并且想验证查询参数是否有效。该参数可以是一个数组(如 repeat 参数中一样)。

我遇到的问题是,当仅传递1个元素时,框架似乎只将其视为字符串,并且错误消息有点麻烦。

具有以下配置:

checkSchema([
{
  foo: {
    in: 'query',
    isAlphanumeric: true,
    optional: true,
    errorMessage: 'Invalid foo'
  }
}])

使用网址http://server/api?foo=bar&foo=not bar时出现以下错误:

{
  "location": "query",
  "param": "foo[1]",
  "value": "not bar",
  "msg": "Invalid foo"
}

这似乎是正确的。

但是使用网址http://server/api?foo=not bar时出现以下错误:

{
  "location": "query",
  "param": "foo[3]",
  "value": " ",
  "msg": "Invalid foo"
}

这没什么大不了的,但是foo[3] param有点误导,因为从技术上讲,它们只是foofoo[0]

我尝试过使用isArray: true,如下所示,但是没有运气:

foo: {
    in: 'query',
    isArray: true,
    isAlphanumeric: true,
    optional: true,
    errorMessage: 'Invalid foo',
},

但是,这似乎实际上忽略了第二个foo参数(因为从技术上讲,字符串是字符数组?)。 并使用单一参数版本foo=no bar,它会两次显示错误消息(我想是因为isArrayisAlphanumeric的验证器都失败了?)

1 个答案:

答案 0 :(得分:0)

好的,看起来express-validator从那时起就更新了,现在提供了toArray消毒剂。 现在,我可以编写以下代码:

checkSchema([
{
  foo: {
    in: 'query',
    optional: true,
    toArray: true,
  },
  'foo.*': {
    in: 'query',
    isAlphanumeric: true,
    optional: true,
    errorMessage: 'Invalid foo'
  }
}])

作为一项额外的奖励,它现在将总是将具有1个参数的查询转换为1个值的数组。