Loopback 4 Как проверить свойства requestBody - PullRequest
0 голосов
/ 21 января 2019

Я ищу способ предотвращения нежелательных свойств, присутствующих в блоке запроса, как описано в соответствующей модели

Вот моя модель:

import { Model, model, property } from '@loopback/repository';

@model({
   name: 'AwsS3',
   strict: true,
   description: 'AWS S3 Object description',
   properties: {
   Key: {
      type: 'String',
      required: 'true',
   },
   Bucket: {
      type: 'String',
      requied: 'true',
   },
 },
})
export class AwsS3 extends Model {
@property({
   type: 'string',
   description: 'path/to/file',
   required: true,
}) Key: string;

@property({
   type: 'string',
   description: 'AWS-S3-Bucket-Name',
   required: true,
})
Bucket: string;

constructor(data: AwsS3) {
  super(data);
 }
}

Я использовал это в контроллере

 function(@requestBody({
    required: true,
    description: 'aws object settings',
    content: {
       'application/json': {},
     },
   }) body : AwsS3
 ){
    console.log(body);
 }

Выдает корректно, когда одно из обоих свойств отсутствует или имеет неправильный тип. Но если я отправляю json как ниже, ничего не выбрасывается и объект обрабатывается с помощью UnwantedProp

{
    Key: 'key',
    Bucket : 'bucket',
    UnwantedProp: 40
}

1 Ответ

0 голосов
/ 21 января 2019

Я нашел, что это достижимо с помощью декоратора @api и установки дополнительных свойств: false из спецификаций openapi.

используйте его следующим образом:

 @api(
    basePath: '/',
    paths : {
       'somepath': {
           'post' : {
               'x-operation-name': 'myfunction',
               'x-controller-name': 'MyController',
               // properties for route
               requestBody: {
                  required: true,
                  content: {
                    'application/json': {
                       schema: {
                         type: 'object',
                         additionalProperties: false, // <=== here it is
                         properties: {
                            Key: { type: 'string'},
                            Bucket: {type: 'string'},
                         },
                         required: ['Bucket', 'Key'],
                       },
                   },
                 },
               },
            }
        }
    }
 )
 export class MyController{
    async myfunction(
       @requestBody({ settings: { strict: true } }) body
    ){}
 }

при тестировании выбрасываетследуя ожиданиям:

{
    "error": {
        "statusCode": 422,
        "name": "UnprocessableEntityError",
        "message": "The request body is invalid. See error object `details` property for more info.",
        "code": "VALIDATION_FAILED",
        "details": [
            {
                "path": "",
                "code": "additionalProperties",
                "message": "should NOT have additional properties",
                "info": {
                    "additionalProperty": "unwantedProp"
                }
            }
        ]
    }
}
...