Membaca Konteks Permintaan dengan Penghias Param
Cipta penghias param tersuai @CurrentUser dan @ClientIp menggunakan createParamDecorator dan ExecutionContext
Membaca Konteks Permintaan dengan Penghias Param ialah pelajaran API Bahagian Belakang Perusahaan NestJS percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran API Bahagian Belakang Perusahaan NestJS, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus API Bahagian Belakang Perusahaan NestJS merangkumi sejumlah 4 pelajaran.
Mengapa Penghias Parameter?
Dalam pengawal NestJS, anda sering perlu mengambil data yang sama daripada permintaan berulang kali: pengguna yang disahkan, IP klien atau id penyewa daripada pengepala. Melakukannya dengan @Req() dan menyelami request.user dalam setiap pengendali adalah berulang-ulang serta mendedahkan butiran rangka kerja kepada logik perniagaan anda.
Penghias parameter tersuai membolehkan anda merangkum proses pengambilan itu sekali dan menggunakannya semula di mana-mana:
@CurrentUser()berbandingreq.user@ClientIp()berbanding menghuraikanx-forwarded-for
Hasilnya ialah kod pengawal yang lebih kemas, lebih mudah diuji dan lebih bersifat deklaratif.
Cara Berulang-ulang
Inilah keadaan yang biasanya anda mulakan: mengambil keseluruhan objek permintaan dan mencapai kandungannya secara manual. Cara ini berfungsi, tetapi setiap pengendali mengulangi baris yang sama, dan pengawal kini mengetahui tentang request.user, yang merupakan butiran pelaksanaan pengawal pengesahan anda.
Perhatikan bahawa logik laluan sebenar tersembunyi di sebalik kod sokongan. Inilah perkara yang dibuang oleh penghias parameter.
import { Controller, Get, Req } from '@nestjs/common';
import { Request } from 'express';
@Controller('profile')
export class ProfileController {
@Get()
getProfile(@Req() request: Request) {
const user = (request as any).user;
return { id: user.id, email: user.email };
}
}createParamDecorator
NestJS menyediakan kilang createParamDecorator daripada @nestjs/common. Anda memberikannya fungsi yang menerima dua argumen dan mengembalikan apa-apa nilai yang ingin disuntik ke dalam parameter pengendali.
- data — argumen pilihan yang dihantar apabila penghias digunakan, contohnya
@CurrentUser('email'). - ctx: ExecutionContext — pembungkus di sekeliling konteks permintaan semasa, tanpa bergantung pada pengangkutan (HTTP, RPC, WebSocket).
Nilai yang dikembalikan menjadi nilai parameter pada waktu panggilan.
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const Example = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
// return any value -> it gets injected into the param
return 'hello';
},
);Mendapatkan Permintaan HTTP
Untuk aplikasi HTTP, anda menukar ExecutionContext umum kepada hos argumen khusus HTTP dan membaca permintaan daripadanya:
ctx.switchToHttp()mengembalikanHttpArgumentsHost..getRequest()memberikan permintaan asas (Express atau Fastify).
Menggunakan switchToHttp() menjadikan penghias jelas tentang pengangkutan yang disasarkannya. Konteks yang sama juga boleh ditukar kepada RPC atau WS untuk protokol lain.
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
import { Request } from 'express';
export const RawRequest = createParamDecorator(
(data: unknown, ctx: ExecutionContext): Request => {
return ctx.switchToHttp().getRequest<Request>();
},
);Membina @CurrentUser
Andaikan pengawal pengesahan (contohnya strategi JWT) telah melampirkan pengguna yang disahkan pada request.user. Penghias @CurrentUser() hanya mengembalikannya.
Ini ialah corak lazim dalam aplikasi NestJS perusahaan: pengawal melakukan pengesahan, manakala penghias menyediakan akses mudah kepada hasilnya tanpa mendedahkan objek permintaan.
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export interface AuthUser {
id: string;
email: string;
roles: string[];
}
export const CurrentUser = createParamDecorator(
(data: unknown, ctx: ExecutionContext): AuthUser => {
const request = ctx.switchToHttp().getRequest();
return request.user;
},
);Menggunakan Argumen data
Parameter pertama, data, ialah perkara yang dihantar oleh pemanggil di dalam kurungan penghias. Anda boleh menggunakannya untuk mengembalikan satu sifat dan bukannya keseluruhan objek:
@CurrentUser()mengembalikan pengguna penuh.@CurrentUser('email')hanya mengembalikan e-mel.
Taipkan argumen data sebagai keyof AuthUser supaya pemanggil mendapat pelengkapan automatik dan keselamatan pada masa penyusunan untuk nama sifat tersebut.
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
import { AuthUser } from './auth-user.interface';
export const CurrentUser = createParamDecorator(
(data: keyof AuthUser | undefined, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
const user: AuthUser = request.user;
return data ? user?.[data] : user;
},
);Menggunakan @CurrentUser dalam Pengawal
Kini kod pengawal kelihatan lebih kemas. Pengawal menjamin bahawa pengguna wujud; penghias menyuntik tepat perkara yang diperlukan oleh setiap pengendali. Tiada @Req() dan tiada lagi capaian sifat secara manual.
Pemisahan ini menjadikan pengendali mudah diuji secara unit: anda hanya perlu memanggil kaedah tersebut dengan objek pengguna biasa.
import { Controller, Get, UseGuards } from '@nestjs/common';
import { JwtAuthGuard } from './jwt-auth.guard';
import { CurrentUser } from './current-user.decorator';
import { AuthUser } from './auth-user.interface';
@UseGuards(JwtAuthGuard)
@Controller('me')
export class MeController {
@Get()
getMe(@CurrentUser() user: AuthUser) {
return user;
}
@Get('email')
getEmail(@CurrentUser('email') email: string) {
return { email };
}
}Membina @ClientIp
Di sebalik pengimbang beban atau proksi songsang, IP klien sebenar bukanlah request.ip, sebaliknya entri pertama dalam pengepala x-forwarded-for. Penghias @ClientIp() memusatkan logik ini supaya setiap pengendali membaca alamat yang betul.
Penting: percayai x-forwarded-for hanya apabila aplikasi anda benar-benar berjalan di sebalik proksi yang dipercayai, dan dayakan tetapan Express trust proxy. Jika tidak, klien boleh memalsukan pengepala tersebut.
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
import { Request } from 'express';
export const ClientIp = createParamDecorator(
(data: unknown, ctx: ExecutionContext): string => {
const request = ctx.switchToHttp().getRequest<Request>();
const forwarded = request.headers['x-forwarded-for'];
if (typeof forwarded === 'string' && forwarded.length > 0) {
return forwarded.split(',')[0].trim();
}
return request.ip ?? '';
},
);Logik Pengambilan Tulen Boleh Diuji
Bahagian yang paling bernilai dalam penghias parameter ialah logik pengambilannya yang tulen. Anda boleh mengasingkannya ke dalam fungsi biasa, mengujinya secara unit dengan permintaan palsu dan memanggilnya daripada penghias. Berikut ialah logik penghuraian IP sebagai program kendiri yang boleh dijalankan.
Ini menunjukkan peraturan untuk memilih alamat yang dimajukan terlebih dahulu serta tingkah laku sandaran — tiada NestJS atau pelayan diperlukan untuk mengesahkannya.
function extractClientIp(headers: Record<string, string>, fallbackIp: string): string {
const forwarded = headers['x-forwarded-for'];
if (typeof forwarded === 'string' && forwarded.length > 0) {
return forwarded.split(',')[0].trim();
}
return fallbackIp;
}
console.log(extractClientIp({ 'x-forwarded-for': '203.0.113.7, 70.41.3.18' }, '10.0.0.1'));
console.log(extractClientIp({}, '10.0.0.1'));
console.log(extractClientIp({ 'x-forwarded-for': '198.51.100.5' }, '10.0.0.1'));Menggabungkan Penghias dalam Satu Pengendali
Penghias parameter boleh digubah secara bebas. Satu pengendali boleh menggabungkan penghias terbina dalam (@Body, @Param) dengan penghias tersuai anda. NestJS menyelesaikan setiap parameter secara berasingan berdasarkan metadata penghiasnya.
Di sini, titik akhir audit merekodkan siapa yang melakukan sesuatu dan dari mana, dengan membaca pengguna serta IP secara deklaratif.
import { Controller, Post, Body, UseGuards } from '@nestjs/common';
import { JwtAuthGuard } from './jwt-auth.guard';
import { CurrentUser } from './current-user.decorator';
import { ClientIp } from './client-ip.decorator';
import { AuthUser } from './auth-user.interface';
@UseGuards(JwtAuthGuard)
@Controller('audit')
export class AuditController {
@Post('action')
record(
@CurrentUser('id') userId: string,
@ClientIp() ip: string,
@Body() body: { action: string },
) {
return { userId, ip, action: body.action, at: new Date().toISOString() };
}
}Pengesahan dan Paip Masih Digunakan
Penghias parameter tersuai mengembalikan nilai mentah, jadi anda masih boleh melampirkan paip kepadanya seperti penghias terbina dalam. Hantar paip sebagai argumen tambahan apabila menggunakan penghias tersebut.
@CurrentUser('id', ParseUUIDPipe)mengesahkan bahawa id yang diambil ialah UUID.- Paip dijalankan selepas kilang penghias mengembalikan nilainya.
Dengan cara ini, anda boleh memisahkan pengambilan dan pengesahan dengan kemas sambil terus mendapat manfaat daripada saluran paip paip NestJS.
import { Controller, Get, ParseUUIDPipe } from '@nestjs/common';
import { CurrentUser } from './current-user.decorator';
@Controller('orders')
export class OrdersController {
@Get('mine')
myOrders(@CurrentUser('id', ParseUUIDPipe) userId: string) {
return { userId };
}
}Semakan Pantas
Uji pemahaman anda tentang cara penghias parameter tersuai membaca permintaan.
Ulang Kaji
Anda telah mempelajari cara membaca konteks permintaan secara deklaratif dengan penghias parameter tersuai:
- createParamDecorator((data, ctx) => ...) membina penghias yang boleh digunakan semula; nilai yang dikembalikan disuntik ke dalam parameter pengendali.
- ctx.switchToHttp().getRequest() mendapatkan permintaan HTTP dengan cara yang jelas terhadap pengangkutan.
- @CurrentUser() membungkus
request.user(yang diisi oleh pengawal pengesahan anda) dan boleh mengembalikan satu sifat melalui argumendatayang ditaip sebagaikeyof AuthUser. - @ClientIp() memusatkan penghuraian
x-forwarded-for, dengan sandaran kepadarequest.ip— percayai pengepala tersebut hanya apabila berada di sebalik proksi sebenar. - Kekalkan logik pengambilan dalam bentuk tulen supaya mudah diuji secara unit, dan ingat bahawa anda masih boleh merangkaikan paip seperti
ParseUUIDPipepada penghias tersuai anda.
Pelajari TypeScript dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 20
- Pelajaran
- 76
Soalan Lazim
Adakah pelajaran “Membaca Konteks Permintaan dengan Penghias Param” percuma?
Ya — teks penuh “Membaca Konteks Permintaan dengan Penghias Param” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus API Bahagian Belakang Perusahaan NestJS, tingkat taraf kepada CoddyKit PRO. Kursus API Bahagian Belakang Perusahaan NestJS merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Membaca Konteks Permintaan dengan Penghias Param”?
Cipta penghias param tersuai @CurrentUser dan @ClientIp menggunakan createParamDecorator dan ExecutionContext Anda berlatih API Bahagian Belakang Perusahaan NestJS menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan API Bahagian Belakang Perusahaan NestJS?
Tiada pengalaman terdahulu diperlukan. Pembelajaran API Bahagian Belakang Perusahaan NestJS di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Membaca Konteks Permintaan dengan Penghias Param” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran API Bahagian Belakang Perusahaan NestJS ini?
Ya. Setiap pelajaran API Bahagian Belakang Perusahaan NestJS menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Membaca Konteks Permintaan dengan Penghias Param
- Melampirkan Metadata dengan SetMetadata dan Reflector
- Menggabungkan Penghias dengan applyDecorators
- Penghias Tahap Kelas untuk Konfigurasi Rentas Fungsi