Можно ли установить значения по умолчанию для DTO? - PullRequest
1 голос
/ 02 апреля 2019

Есть ли способ использовать значения по умолчанию, когда запрос пуст?

Если у меня есть следующий DTO для запроса:

export class MyQuery {
  readonly myQueryItem: string;
}

И мой запрос не содержит запроса, тогда myQuery.myQueryItem будет неопределенным. Как мне сделать так, чтобы оно имело значение по умолчанию?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Вы можете установить значение по умолчанию непосредственно в вашем классе DTO:

export class MyQuery {
  readonly myQueryItem = 'mydefault';
}

Вы должны создать экземпляр класса, чтобы использовать значение по умолчанию.Для этого вы можете, например, использовать ValidationPipe с опцией transform: true.Если значение задается параметрами вашего запроса, оно будет переопределено.

@Get()
@UsePipes(new ValidationPipe({ transform: true }))
getHello(@Query() query: MyQuery) {
  return query;
}

Почему это работает?

1) Каналы применяются ко всем вашим декораторам, например, @Body(), @Param(), @Query() и может преобразовывать значения (например, ParseIntPipe) или выполнять проверки (например, ValidationPipe).

2) ValidationPipe внутренне использует class-validator и class-transformer для проверки,Чтобы иметь возможность выполнять проверку вашего ввода (простые объекты javascript), он сначала должен преобразовать их в аннотированный класс dto, то есть создать экземпляр вашего класса.С настройкой transform: true он автоматически создаст экземпляр вашего класса dto.

Пример (в основном, как это работает):

class Person {
  firstname: string;
  lastname?: string = 'May';

  constructor(person) {
    Object.assign(this, person);
  }
}

// You can use Person as a type for a plain object -> no default value
const personInput: Person = { firstname: 'Yuna' };

// When an actual instance of the class is created, it uses the default value
const personInstance: Person = new Person(personInput);
0 голосов
/ 02 апреля 2019

дает только значение в вашем Dto, например:

export class MyQuery {
  readonly myQueryItem: string = 'value default';
}
...