后端用NodeJs开发,在router时候,我们可能会用到 Joi 组件帮助我们对get, patch等方法的params或者body进行校验。

1
2
3
4
5
router.route('/abc')
.patch(hasPermissions('xxx'), [
validateParams(Joi.object({uuid: Joi.string().uuid().required()})),
validateBody(validationSchema.editData)
], indexController.editAction)

只能为字符串,但要注意empty

1
2
3
4
5
6
7
let schema = Joi.object({
name : Joi.string().empty(""),
});
let{error, value} = schema.validate(data);

let data = {name:""} /*通过校验*/
let data = {name:null} /*不通过校验, 提示name必须为string类型*/

这里着重说明下empty用法,API 17.3.0如下

any.empty(schema)
Considers anything that matches the schema to be empty (undefined).

1
2
3
4
let schema = Joi.string().empty('');
schema.validate(''); // returns { error: null, value: undefined }
schema = schema.empty();
schema.validate(''); // returns { error: "value" is not allowed to be empty, value: '' }

如果用了name : Joi.string().empty(“”),那么name不会传到editAction里面。也就是说’'的情况被忽略。如下场景

  1. 什么什么时候给了name变量值,如张三
  2. 想在前端给name的输入框,删除张三,保存后,name的值传到后端是’’
  3. 然而,在Joi校验时候,name=''传不到controller的action方法,也就不能保存空字串了。

允许空字符串和null

1
2
3
let schema = Joi.object({
name : Joi.string().allow(...[null, ""]),
});