Field middleware
Field middleware field yechilishidan oldin yoki keyin ixtiyoriy kodni ishga tushirish imkonini beradi. Field middleware field natijasini o'zgartirish, field argumentlarini tekshiri
Bu bob faqat code first yondashuviga tegishli.
Field middleware field yechilishidan oldin yoki keyin ixtiyoriy kodni ishga tushirish imkonini beradi. Field middleware field natijasini o'zgartirish, field argumentlarini tekshirish yoki field darajasida rollarni tekshirish (masalan, middleware funksiyasi bajarilayotgan maqsad fieldga kirish uchun talab qilinadigan rollar) uchun ishlatilishi mumkin.
Bir fieldga bir nechta middleware funksiyasini ulashingiz mumkin. Bu holatda ular ketma-ket chaqiriladi va oldingi middleware keyingisini chaqirish yoki chaqirmaslikni hal qiladi. middleware massivida middlewarelar tartibi muhim. Birinchi resolver "eng tashqi" qatlam bo'ladi, shuning uchun u birinchi bo'lib ishlaydi va oxirgi bo'lib tugaydi (graphql-middleware paketi kabi). Ikkinchi resolver "ikkinchi tashqi" qatlam bo'ladi, shuning uchun u ikkinchi bo'lib ishlaydi va oxiridan ikkinchi bo'lib tugaydi.
Boshlash
Avval klientga qaytarilishidan oldin field qiymatini loglaydigan oddiy middleware yaratamiz:
1import { FieldMiddleware, MiddlewareContext, NextFn } from '@nestjs/graphql';
2
3const loggerMiddleware: FieldMiddleware = async (
4 ctx: MiddlewareContext,
5 next: NextFn,
6) => {
7 const value = await next();
8 console.log(value);
9 return value;
10};MiddlewareContext bu GraphQL resolver funksiyasi odatda qabul qiladigan argumentlar bilan bir xil argumentlardan iborat obyekt ({{ '{' }} source, args, context, info {{ '}' }}), NextFn esa stackdagi keyingi middleware yoki haqiqiy field resolverni bajarishga imkon beradigan funksiya.
Field middleware funksiyalari dependency injection qilolmaydi va Nest DI konteyneriga kira olmaydi, chunki ular juda yengil bo'lishi va potensial vaqt talab qiladigan operatsiyalarni (masalan, bazadan ma'lumot olish) bajarmasligi kerak. Agar tashqi servislarni chaqirish yoki data source dan so'rov qilish kerak bo'lsa, buni root query/mutation handlerga bog'langan guard/interceptor ichida bajaring va natijani context obyektiga joylang; keyin uni field middleware ichida (MiddlewareContext obyektidan) olishingiz mumkin.
Field middleware FieldMiddleware interfeysiga mos bo'lishi kerakligini unutmang. Yuqoridagi misolda avval next() funksiyasini ishga tushiramiz (u haqiqiy field resolverni bajaradi va field qiymatini qaytaradi), so'ng bu qiymatni loglaymiz. Middleware funksiyasi qaytargan qiymat oldingi qiymatni to'liq almashtiradi va biz hech qanday o'zgarish kiritmoqchi bo'lmaganimiz uchun original qiymatni qaytaramiz.
Shu bilan, middleware ni bevosita @Field() dekoratorida quyidagicha ro'yxatdan o'tkazamiz:
1@ObjectType()
2export class Recipe {
3 @Field({ middleware: [loggerMiddleware] })
4 title: string;
5}Endi Recipe object type ning title fieldi so'ralganda, original field qiymati konsolga loglanadi.
extensions funksiyasi yordamida field darajasidagi ruxsat tizimini qanday implementatsiya qilish mumkinligini bilish uchun ushbu bo'limga qarang.
Field middleware faqat ObjectType klasslariga qo'llanadi. Batafsil ma'lumot uchun ushbu issuega qarang.
Yuqorida aytilganidek, field qiymatini middleware ichidan boshqarishimiz mumkin. Namoyish uchun retsept sarlavhasini katta harflarga o'tkazamiz (mavjud bo'lsa):
1const value = await next();
2return value?.toUpperCase();Bu holatda so'ralgan har bir sarlavha avtomatik ravishda katta harflarga o'tkaziladi.
Xuddi shuningdek, field middleware ni custom field resolverga (ya'ni @ResolveField() dekoratori bilan belgilangan metodga) bog'lashingiz mumkin, quyidagicha:
1@ResolveField(() => String, { middleware: [loggerMiddleware] })
2title() {
3 return 'Placeholder';
4}Agar field resolver darajasida enhancers yoqilgan bo'lsa (batafsil), field middleware funksiyalari metodga bog'langan interceptor, guard va h.k. lar ishlashidan oldin (ammo query yoki mutation handlerlari uchun ro'yxatdan o'tkazilgan root-level enhancersdan keyin) bajariladi.
Global field middleware
Muayyan fieldga bevosita middleware bog'lashdan tashqari, bir yoki bir nechta middleware funksiyasini global tarzda ro'yxatdan o'tkazishingiz mumkin. Bu holda ular object type laringizning barcha fieldlariga avtomatik ulanadi.
1GraphQLModule.forRoot({
2 autoSchemaFile: 'schema.gql',
3 buildSchemaOptions: {
4 fieldMiddleware: [loggerMiddleware],
5 },
6}),Global ro'yxatdan o'tkazilgan field middleware funksiyalari lokal (muayyan fieldga bevosita bog'langan) middlewarelardan oldin bajariladi.