LoopBack对接MongoDB如何配置JSON Schema依赖实现字段条件校验
LoopBack 操作 MongoDB 实现条件式JSON Schema校验
之前的自定义配置不生效核心原因有三个:
- 写的
if(type == "redirect")是JavaScript逻辑语法,不符合JSON Schema的标准声明式结构,会被校验引擎直接静默跳过,不会抛错 - 跨字段的依赖校验属于模型级规则,不能写在单个
url字段的@property配置里,单字段配置无法引用同级的type字段做判断 - 旧版
dependencies关键字仅支持字段存在性依赖(比如A字段存在时必须传B字段),不支持基于字段值的条件判断,标准值依赖场景用if/then/else关键字实现即可。
正确配置步骤
1. 调整单字段基础定义
先移除url字段上全局生效的pattern规则,只保留所有场景通用的校验逻辑:
@property({ type: 'string', required: true, }) // 可直接加枚举限定,提前拦截非法type值 type: 'redirect' | 'anchor'; @property({ type: 'string', required: true, jsonSchema: { maxLength: 2000, // 所有type场景都生效的长度规则保留 }, }) url: string;
2. 添加模型级条件校验
跨字段的条件规则要写在@model装饰器的根级jsonSchema配置里,LoopBack默认集成的AJV校验引擎原生支持JSON Schema Draft 7+的if/then/else语法:
@model({ jsonSchema: { // 命中规则:type字段值严格等于redirect if: { properties: { type: { const: 'redirect' } }, required: ['type'] }, // 命中后追加的校验规则 then: { properties: { url: { pattern: '^[\\]*$' // 替换为你实际业务需要的正则表达式 } } } // 如果type为anchor时需要对url加其他校验,追加else块写对应规则即可 } }) // 替换成你实际定义的模型类名 export class YourBizModel extends Entity { // 上面写的type、url属性定义放在类内部 }
校验效果说明
- 请求载荷中
type值为anchor时,仅校验url的maxLength规则,不会触发正则校验 - 请求载荷中
type值为redirect时,除长度校验外,会额外校验url是否匹配配置的正则,不满足规则时直接返回422参数校验错误 - 2020年之后发布的LoopBack 4版本默认开启
if/then/else语法支持,不需要额外修改AJV配置。
内容的提问来源于stack exchange,提问作者MochaTesty
相关产品推荐
相关产品推荐

