Понять, что такое параметр маршрута и запроса, когда его использовать и как использовать в NestJS.
Всем привет! 👋
В этом посте вы узнаете, что такое параметр маршрута и запроса, когда его использовать и как использовать в Nest JS.
Этот пост является частью серии руководств по Nest JS. Ознакомьтесь с другим моим постом о Nest JS, чтобы узнать больше об этом.
Исходно опубликовано —https://www.nandhakumar.io/post/nest-js-tutorial-3-route-and-query-param
Предпосылка
- JavaScript
- TypeScript (необязательно)
- Основы ООП
- Почтальон (для тестирования API)
- Редактор кода
- Узел.JS
Понимание параметров маршрута и запроса
Параметры маршрута
Параметры маршрута используются для получения определенных данных.
Пример сценария,
Допустим, вы хотите получить информацию о пользователе с помощью 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 .
Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.