Type/Interface 与请求正文验证一起使用被忽略

Type/Interface used with request body validation is ignored

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

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 }

它接受它并忽略验证

它不应允许以下值 - 因为它们不是 included/against 我们的接口 idAndAge

{ anyKey: anyValue }

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

根据documentation您需要为您的模型添加相应的模型装饰器:

In order to use @requestBody in a parameter type, the model in the parameter type must be decorated with @model and @property.

所以你可以简单地做:

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

环回将根据生成的 json-schema 正确验证请求正文。

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

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