Serializatsiya
Serializatsiya tarmoq javobida obyektlar qaytarilishidan oldin sodir bo'ladigan jarayondir. Bu klientga qaytariladigan ma'lumotlarni transformatsiya qilish va sanitizatsiya qilish
Serializatsiya tarmoq javobida obyektlar qaytarilishidan oldin sodir bo'ladigan jarayondir. Bu klientga qaytariladigan ma'lumotlarni transformatsiya qilish va sanitizatsiya qilish qoidalarini taqdim etish uchun mos joy. Masalan, parollar kabi maxfiy ma'lumotlar har doim javobdan chiqarib tashlanishi kerak. Yoki, ayrim xossalar qo'shimcha transformatsiyani talab qilishi mumkin, masalan, entity ning faqat ma'lum xossalarini yuborish. Bu transformatsiyalarni qo'lda bajarish zerikarli va xatolarga moyil bo'lishi mumkin, va barcha holatlar qamrab olinganiga ishonchsizlik qoldiradi.
Umumiy ko'rinish
Nest bu operatsiyalarni sodda tarzda bajarishga yordam beradigan ichki imkoniyatni taqdim etadi. ClassSerializerInterceptor interceptori kuchli class-transformer paketidan foydalanib, obyektlarni transformatsiya qilishning deklarativ va kengaytiriladigan usulini beradi. U bajaradigan asosiy ish - metod handleridan qaytgan qiymatni olib, class-transformer dan instanceToPlain() funksiyasini qo'llash. Shu orqali u quyida ko'rsatilganidek entity/DTO klassida class-transformer dekoratorlari bilan ifodalangan qoidalarni qo'llay oladi.
Serializatsiya StreamableFile javoblariga qo'llanilmaydi.
Xossalarni chiqarib tashlash
Keling, password xossasini user entity dan avtomatik chiqarib tashlamoqchi ekanimizni faraz qilaylik. Entity ni quyidagicha belgilaymiz:
1import { Exclude } from 'class-transformer';
2
3export class UserEntity {
4 id: number;
5 firstName: string;
6 lastName: string;
7
8 @Exclude()
9 password: string;
10
11 constructor(partial: Partial<UserEntity>) {
12 Object.assign(this, partial);
13 }
14}Endi ushbu klass instansiyasini qaytaradigan metod handlerga ega controllerni ko'rib chiqamiz.
1@UseInterceptors(ClassSerializerInterceptor)
2@Get()
3findOne(): UserEntity {
4 return new UserEntity({
5 id: 1,
6 firstName: 'John',
7 lastName: 'Doe',
8 password: 'password',
9 });
10}Warning Eslatma: biz klass instansiyasini qaytarishimiz kerak. Masalan,
{{ '{' }} user: new UserEntity() {{ '}' }}kabi oddiy JavaScript obyektini qaytarsangiz, obyekt to'g'ri serializatsiya qilinmaydi.
ClassSerializerInterceptor@nestjs/common paketidan import qilinadi.
Ushbu endpoint so'ralganda, klient quyidagi javobni oladi:
1{
2 "id": 1,
3 "firstName": "John",
4 "lastName": "Doe"
5}Interceptor ilova bo'ylab qo'llanishi mumkinligini unutmang (bu bu yerda yoritilgan). Interceptor va entity klass deklaratsiyasining kombinatsiyasi UserEntity qaytaradigan har qanday metod password xossasini olib tashlashini kafolatlaydi. Bu biznes qoidalarini markazlashgan tarzda ijro etishning bir usulini beradi.
Xossalarni chiqarish
@Expose() dekoratori orqali xossalarga alias nomlar berishingiz yoki xossa qiymatini hisoblash uchun funksiya bajarishingiz mumkin (bu getter funksiyalariga o'xshash), quyida ko'rsatilgandek.
1@Expose()
2get fullName(): string {
3 return `${this.firstName} ${this.lastName}`;
4}Transform
Qo'shimcha ma'lumot transformatsiyasini @Transform() dekoratori orqali bajarishingiz mumkin. Masalan, quyidagi konstruktsiya butun obyektni qaytarish o'rniga RoleEntity ning name xossasini qaytaradi.
1@Transform(({ value }) => value.name)
2role: RoleEntity;Opsiyalarni uzatish
Transformatsiya funksiyalarining default xatti-harakatini o'zgartirishni xohlashingiz mumkin. Default sozlamalarni override qilish uchun @SerializeOptions() dekoratoriga options obyektini uzating.
1@SerializeOptions({
2 excludePrefixes: ['_'],
3})
4@Get()
5findOne(): UserEntity {
6 return new UserEntity();
7}@SerializeOptions() dekoratori @nestjs/common paketidan import qilinadi.
@SerializeOptions() orqali uzatilgan opsiyalar ichki instanceToPlain() funksiyasining ikkinchi argumenti sifatida uzatiladi. Bu misolda, _ prefiksi bilan boshlanadigan barcha xossalar avtomatik chiqarib tashlanadi.
Oddiy obyektlarni transformatsiya qilish
@SerializeOptions dekoratoridan foydalanib controller darajasida transformatsiyalarni majburlashingiz mumkin. Bu barcha javoblar ko'rsatilgan klass instansiyalariga aylantirilishini va class-validator yoki class-transformer dekoratorlari qo'llanishini ta'minlaydi, hatto oddiy obyektlar qaytarilganida ham. Bu yondashuv kodni yanada toza qiladi va klassni qayta-qayta instansiyalash yoki plainToInstance chaqirish zaruratini yo'q qiladi.
Quyidagi misolda, ikkala shartli tarmoqda ham oddiy JavaScript obyektlarini qaytarayotgan bo'lsak-da, ular avtomatik ravishda UserEntity instansiyalariga aylantiriladi va tegishli dekoratorlar qo'llanadi:
1@UseInterceptors(ClassSerializerInterceptor)
2@SerializeOptions({ type: UserEntity })
3@Get()
4findOne(@Query() { id }: { id: number }): UserEntity {
5 if (id === 1) {
6 return {
7 id: 1,
8 firstName: 'John',
9 lastName: 'Doe',
10 password: 'password',
11 };
12 }
13
14 return {
15 id: 2,
16 firstName: 'Kamil',
17 lastName: 'Mysliwiec',
18 password: 'password2',
19 };
20}Controller uchun kutilayotgan qaytish tipini ko'rsatish orqali TypeScript ning type-checking imkoniyatlaridan foydalanib, qaytariladigan oddiy obyekt DTO yoki entity shakliga mos kelishini tekshirishingiz mumkin. plainToInstance funksiyasi bunday type hinting darajasini bermaydi, bu esa oddiy obyekt kutilgan DTO yoki entity tuzilmasiga mos kelmasa, potensial xatolarga olib kelishi mumkin.
Misol
Ishlaydigan misol bu yerda mavjud.
WebSockets va Microservices
Bu bob HTTP uslubidagi ilovalar (masalan, Express yoki Fastify) misollarini ko'rsatsa-da, ClassSerializerInterceptor ishlatilayotgan transport usulidan qat'i nazar WebSockets va Microservices uchun xuddi shunday ishlaydi.
Batafsil
class-transformer paketida taqdim etilgan mavjud dekoratorlar va opsiyalar haqida batafsil bu yerda o'qing.