Преобразование classToPlain не применяется с контроллерами маршрутизации - PullRequest
0 голосов
/ 03 апреля 2020

Относительно использования контроллеров-преобразователей классов и маршрутизации.
Может быть, я не понимаю истинного значения библиотек-преобразователей классов, но я хотел использовать его для преобразования объекта, полученного от сервера (третий -party) и адаптировать их к моей собственной модели, с разными именами. Что теоретически должно работать, и это происходит при консольном ведении журнала новой преобразованной модели или даже при JSON .stringify-ing.
Но по какой-то причине при выводе модели с использованием контроллеров маршрутизации просто выводит тот же объект происхождения.

Класс пользователя:

class User {
  @Expose({ name: 'uid' }) // To convert/rename the "uid" property received from the server
  id: string
  firstName: string
  lastName: string
}

users-controller.ts:

@JsonController('/users')
export class UsersController {
  @Get('/')
  async get() {
    const user = plainToClass(User, {
      uid: '123',
      firstName: 'Matthew',
      lastName: 'Michalsky'
    })

    console.log(user)

    return user
  }
}

консоль выводит ожидаемое значение:

User {
  id: '123',
  firstName: 'Matthew',
  lastName: 'Michalsky'
}

Но ответ от UsersController (через lib для контроллеров маршрутизации) таков:

{
  uid: '123',
  firstName: 'Matthew',
  lastName: 'Michalsky'
}

Что-то, что вы видите, может быть пропущено / я делаю неправильно? Спасибо.

1 Ответ

0 голосов
/ 08 апреля 2020

право. Response отправляет обратно json данные, и мы не можем передавать имена классов с этим. Поэтому, если вы возвращаете экземпляр класса из контроллера, routing-controllers применяет classToPlain к нему и вы получаете преобразованный простой объект.

Если вы хотите пропустить это поведение, вам следует настроить @ResponseClassTransformOption.

  @ResponseClassTransformOption({
    ignoreDecorators: true,
  })
  @Get('/')
  async get() {

В качестве опции вы можете установить направление преобразования, например, только toClass, тогда, когда экземпляр класса обрабатывается через classToPlain, такие декораторы не имеют эффекта.

...