Автоматический анализ параметра запроса для объекта при определении в NestJS - PullRequest
0 голосов
/ 12 сентября 2018

Я пишу приложение NestJS. Некоторые из конечных точек поддерживают сортировку, например http://127.0.0.1:3000/api/v1/members?sort=-id&take=100 Что означает сортировку по id по убыванию.

Этот параметр поступает в качестве параметра @Query и передается моему сервису. Этот сервис преобразует его в объект, который используется TypeORM:

{
  id: 'DESC'
}

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

Я пробовал intercepter, но этот не мог легко изменить параметры запроса в нужный объект.

A pipe работал, но тогда мне все еще нужно добавить @Query(new SortPipe()) для каждого определения конечной точки.

Другой вариант - в самом хранилище. Документация NestJS очень хорошо написана, но не содержит указаний, куда что ставить.

Есть ли кто-то, у кого была похожая проблема с преобразованием параметров запроса до их использования в NestJS, и может объяснить, какой подход лучше всего подходит в NestJS?

Этот вопрос может выглядеть как вопрос, основанный на мнении, однако я ищу способ, которым это должно быть сделано с учетом философии NestJS.

1 Ответ

0 голосов
/ 29 мая 2019

Трубы, вероятно, самый простой способ сделать это. Вместо добавления своего канала для каждого определения конечной точки вы можете добавить глобальный канал, который будет вызываться на каждой конечной точке. В вашем main.ts:

async function bootstrap() {
  ...
  app.useGlobalPipes(new SortPipe());
  ...
}

Затем вы можете создать трубу следующим образом:

import { PipeTransform, Injectable, ArgumentMetadata } from '@nestjs/common';

@Injectable()
export class SortPipe implements PipeTransform {
  transform(value: any, metadata: ArgumentMetadata) {
    const { type } = metadata;
    // Make sure to only run your logic on queries
    if (type === 'query') return this.transformQuery(value);

    return value;
  }

  transformQuery(query: any) {
    if (typeof query !== 'object' || !value) return query;

    const { sort } = query;
    if (sort) query.sort = convertForTypeOrm(sort);

    return query;
  }
}

Если вы не хотите, чтобы значение сортировки на ВСЕХ конечных точках автоматически конвертировалось, вы можете передать пользовательский параметр в @Query(), например @Query('sort'). А потом:

  transform(value: any, metadata: ArgumentMetadata) {
    const { type, data } = metadata;
    // Make sure to only run your logic on queries when 'sort' is supplied
    if (type === 'query' && data === 'sort') return this.transformQuery(value);

    return value;
  }
...