与请求正文验证一起使用的类型/接口将被忽略

时间:2019-03-24 16:09:27

标签: node.js typescript validation loopback

给出以下在控制器内定义的接口:

interface idAndAge {
 id : string,
 age : number
}

这是端点定义:

@put('/tests')
  async replaceById(
    @requestBody() test: idAndAge,// <--to validate the input
  ): Promise<void> {
    await this.testRepository.updateAll(test,{id : test.id});
  }

例如,当此端点接收以下输入时(其属性未在界面中定义):

{ anyKey: anyValue }

它接受它并忽略验证

它不应该允许以下值-因为我们的接口idAndAge中不包含以下值/ p

{ anyKey: anyValue }

如果要测试问题,请检查this repo

1 个答案:

答案 0 :(得分:0)

根据documentation,您需要向模型中添加相应的模型修饰符:

  

为了在参数类型中使用@requestBody,必须用@model和@property装饰该参数类型中的模型。

所以您可以简单地做:

@model()
class idAndAge {
  @property({ required: true })
  id: string;
  @property({ required: true })
  age: number
}

和环回将针对生成的json模式正确验证请求正文。

更新: Afaik目前不支持添加“ allowAdditionalProperties”装饰器,但您可以按如下所示直接在requestBody-decorator中使用json模式:

@requestBody({
      required: true,
      content: {
        'application/json': {
          schema: {
            type: 'object',
            additionalProperties: false, // <=== important
            properties: {
              id: { type: 'string' },
              age: { type: 'number' }
            },
            required: [
              "id"
            ]
          }
        }
      }})