Usullar3 min read

Cookie'lar

HTTP cookie - bu foydalanuvchi brauzerida saqlanadigan kichik ma'lumot bo'lagi. Cookie'lar saytlar holatga bog'liq ma'lumotlarni eslab qolishi uchun ishonchli mexanizm sifatida yar

HTTP cookie - bu foydalanuvchi brauzerida saqlanadigan kichik ma'lumot bo'lagi. Cookie'lar saytlar holatga bog'liq ma'lumotlarni eslab qolishi uchun ishonchli mexanizm sifatida yaratilgan. Foydalanuvchi saytga yana kirganda, cookie so'rov bilan avtomatik yuboriladi.

Express bilan foydalanish (default)

Avval kerakli paketni (va TypeScript foydalanuvchilari uchun uning tiplari) o'rnating:

Terminal
1$ npm i cookie-parser
2$ npm i -D @types/cookie-parser

O'rnatish tugagach, cookie-parser middleware'ini global middleware sifatida qo'llang (masalan, main.ts faylida).

TypeScript
1import * as cookieParser from 'cookie-parser';
2// somewhere in your initialization file
3app.use(cookieParser());

cookieParser middleware'iga bir nechta opsiyalarni uzatishingiz mumkin:

  • secret cookie'larni imzolash uchun ishlatiladigan satr yoki massiv. Bu ixtiyoriy; ko'rsatilmasa, imzolangan cookie'larni parse qilmaydi. Agar satr berilsa, u secret sifatida ishlatiladi. Agar massiv berilsa, har bir secret bilan navbatma-navbat cookie'ni unsign qilishga urinadi.
  • options cookie.parse ga ikkinchi opsiya sifatida uzatiladigan obyekt. Batafsil ma'lumot uchun cookie ga qarang.

Middleware so'rovdagi Cookie headerini parse qiladi va cookie ma'lumotlarini req.cookies xossasi sifatida, secret berilgan bo'lsa req.signedCookies xossasi sifatida ochib beradi. Bu xossalar cookie nomidan cookie qiymatiga bo'lgan name-value juftliklaridir.

Secret berilganda, modul imzolangan cookie qiymatlarini unsign va validatsiya qiladi hamda bu name-value juftliklarni req.cookies dan req.signedCookies ga ko'chiradi. Imzolangan cookie - bu qiymati s: prefiksi bilan boshlanadigan cookie. Imzo validatsiyasidan o'tmagan imzolangan cookie'larda qiymat buzilgan qiymat o'rniga false bo'ladi.

Shundan so'ng cookie'larni route handlerlar ichida quyidagicha o'qishingiz mumkin:

TypeScript
1@Get()
2findAll(@Req() request: Request) {
3  console.log(request.cookies); // or "request.cookies['cookieKey']"
4  // or console.log(request.signedCookies);
5}
Hint

@Req() dekoratori @nestjs/common paketidan, Request esa express paketidan import qilinadi.

Chiqayotgan javobga cookie biriktirish uchun Response#cookie() metodidan foydalaning:

TypeScript
1@Get()
2findAll(@Res({ passthrough: true }) response: Response) {
3  response.cookie('key', 'value')
4}
Warning

Agar javobni qayta ishlash mantiqini freymvorkka qoldirmoqchi bo'lsangiz, yuqorida ko'rsatilgandek passthrough opsiyasini true qilib qo'yishni unutmang. Batafsil bu yerda.

Hint

@Res() dekoratori @nestjs/common paketidan, Response esa express paketidan import qilinadi.

Fastify bilan foydalanish

Avval kerakli paketni o'rnating:

Terminal
1$ npm i @fastify/cookie

O'rnatish tugagach, @fastify/cookie plaginini ro'yxatdan o'tkazing:

TypeScript
1import fastifyCookie from '@fastify/cookie';
2
3// somewhere in your initialization file
4const app = await NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter());
5await app.register(fastifyCookie, {
6  secret: 'my-secret', // for cookies signature
7});

Shundan so'ng cookie'larni route handlerlar ichida quyidagicha o'qishingiz mumkin:

TypeScript
1@Get()
2findAll(@Req() request: FastifyRequest) {
3  console.log(request.cookies); // or "request.cookies['cookieKey']"
4}
Hint

@Req() dekoratori @nestjs/common paketidan, FastifyRequest esa fastify paketidan import qilinadi.

Chiqayotgan javobga cookie biriktirish uchun FastifyReply#setCookie() metodidan foydalaning:

TypeScript
1@Get()
2findAll(@Res({ passthrough: true }) response: FastifyReply) {
3  response.setCookie('key', 'value')
4}

FastifyReply#setCookie() metodi haqida ko'proq ma'lumot uchun ushbu sahifaga qarang.

Warning

Agar javobni qayta ishlash mantiqini freymvorkka qoldirmoqchi bo'lsangiz, yuqorida ko'rsatilgandek passthrough opsiyasini true qilib qo'yishni unutmang. Batafsil bu yerda.

Hint

@Res() dekoratori @nestjs/common paketidan, FastifyReply esa fastify paketidan import qilinadi.

Maxsus dekorator yaratish (cross-platform)

Kiruvchi cookie'larga qulay, deklarativ tarzda kirish uchun custom decorator yaratishimiz mumkin.

TypeScript
1import { createParamDecorator, ExecutionContext } from '@nestjs/common';
2
3export const Cookies = createParamDecorator((data: string, ctx: ExecutionContext) => {
4  const request = ctx.switchToHttp().getRequest();
5  return data ? request.cookies?.[data] : request.cookies;
6});

@Cookies() dekoratori req.cookies obyektidan barcha cookie'larni yoki nomi berilgan cookie'ni ajratib oladi va dekoratsiya qilingan parametrni shu qiymat bilan to'ldiradi.

Shundan so'ng dekoratorni route handler imzosida quyidagicha ishlatamiz:

TypeScript
1@Get()
2findAll(@Cookies('name') name: string) {}