Понять, что такое параметр маршрута и запроса, когда его использовать и как использовать в NestJS.

Всем привет! 👋

В этом посте вы узнаете, что такое параметр маршрута и запроса, когда его использовать и как использовать в Nest JS.

Этот пост является частью серии руководств по Nest JS. Ознакомьтесь с другим моим постом о Nest JS, чтобы узнать больше об этом.

Исходно опубликованоhttps://www.nandhakumar.io/post/nest-js-tutorial-3-route-and-query-param

Предпосылка

Понимание параметров маршрута и запроса

Параметры маршрута

Параметры маршрута используются для получения определенных данных.

Пример сценария,
Допустим, вы хотите получить информацию о пользователе с помощью ID, поэтому ID может быть передано как параметр маршрута, подобный этому 👇

http://api.com/5689

Здесь 5689 — это ID пользователя.

Параметр запроса

Параметры запроса используются, когда вы хотите фильтровать, сортировать и разбивать данные на страницы.

Пример сценария,
Допустим, вы хотите получить список пользователей, имя которых совпадает. Итак, здесь имя может быть передано в качестве параметра запроса, как это 👇

http://api.com?name=tamilan

Здесь nametamilan передается как параметр запроса. Чтобы получить результаты, соответствующие названию.

Вы также можете передать несколько параметров запроса.

В дополнение к фильтрации по имени мы также можем добавить запрос сортировки с существующим запросом имени, как этот 👇

http://api.com?name=tamilan&sort=name

Это краткое описание маршрута и параметров запроса!

Теперь давайте посмотрим, как захватить эти параметры запроса и маршрута в Nest JS.

Использование параметров маршрута и запроса в Nest JS

Для начала создайте новый проект гнезда, используя гнездо cli. Если вы не знаете, как создать новый проект, посмотрите этот пост

Я создал новый проект гнезда с его стартовым кодом.

Вот структура проекта, которая у меня есть сейчас,

Требования

Нам нужны два маршрута,

/user

  • Это должен быть запрос GET
  • Он должен возвращать всех пользователей, когда нет параметра запроса.
  • Он должен возвращать всех пользователей, которые соответствуют имени, когда передается параметр запроса имени.

/user/:id

  • Это должен быть запрос GET
  • Он должен вернуть пользователя, который соответствует идентификатору, переданному в качестве параметра маршрута.

Выполнение

Шаг 1:

Добавьте некоторые фиктивные пользовательские данные в файл службы.

Поскольку мы используем машинописный текст, было бы неплохо добавить интерфейс для пользователя.

// app.service.ts

import { Injectable } from '@nestjs/common';

// user interface
export interface IUser {
  id: number;
  name: string;
  age: number;
}

@Injectable()
export class AppService {
  // list of users
  private users: IUser[] = [
    {
      id: 1,
      name: 'Tamilan',
      age: 23,
    },
    {
      id: 1,
      name: 'Nandha',
      age: 24,
    },
    {
      id: 1,
      name: 'Nandha Kumar',
      age: 24,
    },
  ];
}

Шаг 2:

Создайте метод findUsersByName, который возвращает пользователей, соответствующих запросу «имя», или всех пользователей, если запроса имени нет.

Добавьте этот метод в тот же файл службы

findUsersByName(nameToBeMatched: string): IUser[] {
    return nameToBeMatched
      ? this.users.filter((user) =>
          // return users with name matching
          // 'name' query param
          user.name.toLowerCase().includes(nameToBeMatched),
        )
      : // returns all the users if the
        // 'name' query param is 'null' or ''
        this.users;
  }

Шаг 3:

Создайте еще один метод findUserById, который возвращает пользователя, соответствующего параметру маршрута 'id'.

Добавьте этот метод в тот же файл службы

findUserById(id: string): IUser {
    // return user with id matching 'id' route param

    // By Default when you get value from query or route
    // param it will be string, But in our case user id is of
    // type number. So we are making a type conversion for id
    return this.users.find((user) => user.id === Number(id));
  }

Шаг 4:

Обновите базовый маршрут контроллера до /user

import { Controller, Get} from '@nestjs/common';
import { AppService, IUser } from './app.service';

@Controller('/user') // update the base route to '/user'
export class AppController {
  constructor(private readonly appService: AppService) {}

}

Шаг 5:

Выполнение первой части требования.

Создайте метод getUsers с декоратором @Get().

И он должен принимать декоратор @Query() в качестве аргумента. Так что всякий раз, когда мы добавляем запрос к URL-адресу, эти параметры будут захвачены этим аргументом.

В реализации передайте параметры запроса сервисному методу (findUsersByName), который мы уже реализовали в сервисе.

Наконец, верните данные

import { Controller, Get} from '@nestjs/common';
import { AppService, IUser } from './app.service';

@Controller('/user')
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getUsers(@Query() params: any): IUser[] {
    return this.appService.findUsersByName(params.name);
  }
}

Профессиональный совет

Если вам нужно конкретное свойство из запроса, вы можете указать свойство name в декораторе @Query() вот так 👇

@Get()
  getUsers(@Query('name') name: string): IUser[] {
    return this.appService.findUsersByName(name);
  }

Шаг 6:

Выполнение второй части требования.

Создайте метод getUserById с декоратором @Get(':id').

Примечание.
Здесь мы определили параметр маршрута ':id' в декораторе @Get()
.

И он должен принимать декоратор @Param() в качестве аргумента. Так что параметр маршрута будет захвачен этим аргументом.

В реализации передайте параметры запроса сервисному методу (findUserById), который мы уже реализовали в сервисе.

Наконец, верните данные

import { Controller, Get, Param, Query } from '@nestjs/common';
import { AppService, IUser } from './app.service';

@Controller('/user')
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getUsers(@Query() params: any): IUser[] {
    return this.appService.findUsersByName(params.name);
  }

  @Get(':id')
  getUserById(@Param() params: any): IUser {
    return this.appService.findUserById(params.id);
  }
}

Профессиональный совет

Подобно декоратору @Query(), вы можете указать свойство id в декораторе @Param() следующим образом 👇

@Get()
  getUsers(@Param('id') id: string): IUser {
    return this.appService.findUsersByName(id);
  }

Вот и все!

В соответствии с требованием вы реализовали API.

Тестирование

Давайте протестируем реализацию прямо сейчас!

Запустите сервер, выполнив

npm run start:dev

Откройте URL-адрес сервера http://localhost:3000 в Postman или любом инструменте тестирования API.

Тестовый пример 1:

Получение всех пользователей без параметров запроса

И у нас есть все пользователи.

✅ Тестовый кейс пройден!

Тестовый пример 2:

Получение всех пользователей с параметром запроса name

И мы получили всех пользователей, соответствующих имени, переданному в параметре запроса.

✅ Тестовый кейс пройден!

Тестовый пример 3:

Получение пользователя по идентификатору с параметром маршрута id

И мы получили пользователя с идентификатором, который мы передали в маршруте

✅ Тестовый кейс пройден!

Попробуйте реализовать разные сценарии с несколькими параметрами Query и Route.

Поздравляем! 👏

Вы успешно реализовали API с параметрами Query и Route в Nest.JS.

Получите готовый исходный код здесь.

Спасибо за прочтение!

Надеюсь, вы узнали что-то новое сегодня 😊.

Подпишитесь на меня, чтобы получать уведомления обо всех предстоящих публикациях в этой серии.

Подписывайтесь и общайтесь со мной в Twitter, Instagram, Email и LinkedIn, чтобы узнать больше о таких интересных вещах.

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .

Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.