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"
]
}
}
}})
给定控制器内部定义的以下接口:
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"
]
}
}
}})