我在我的后端项目中使用了 express-validator 这个包来验证前端发来得请求,遇到了一个问题:

http://localhost:3000/static/uploads/ba2e43f4-ca65-4094-8e65-aed85495fcc9.png

这个字符串命名就是URL,为什么没有通过isURL()的校验呢?

在搜索的过程中,我发现 express-validator 项目的贡献者 fedeci 在这个issue 中提到,express-validator 是对
validator.js 的封装,你在使用 express-validator 中遇到的问题可能在 validator.js 的文档中找到答案。

于是我开始翻找 validator.js 的文档,在文档里看到 isURL() 验证器有一个选项默认是设置为 true的 :require_tld: true
这样问题就好解释了,isURL() 默认会判断是否有顶级域(比如 .com .net), 这样 localhost 当然就无法通过校验了。
这时我们就需要给 isURL() 传递一个参数,像这样:isURL({ require_tld: false })
另外需要注意的是,这里的选项式针对 isURL() 的验证规则,如果是针对这个字段的规则,需要用.optinal()指定,比如使用 isXXX 验证的字段默认是必填项,如果只想校验类型不需要必填,可以这么写:

 body("avatar_url")
    .isURL({ require_tld: false })
    .optional({ nullable: true })
    .withMessage("头像图片地址必须是一个URL")
    .bail(),