آشنایی با Resolver و نحوه پاسخدهی GraphQL
در GraphQL، زمانی که یک کلاینت دادهای را درخواست میکند، سرور باید بداند چگونه به این درخواست پاسخ دهد. اینجا مفهوم Resolver وارد میشود. Resolverها نقش رابط بین پرسوجوهای GraphQL و دادههای واقعی در سرور را ایفا میکنند.
Resolver چیست؟
Resolver یک تابع در سرور است که مشخص میکند هر فیلد در یک Type چگونه مقداردهی شود و چه دادهای به کلاینت برگردانده شود. هر فیلد در Schema میتواند یک Resolver داشته باشد، اما اگر مقدار فیلد مستقیم در سرور موجود باشد، میتوان بدون تعریف Resolver از مقدار پیشفرض استفاده کرد.
مثال ساده:
type User {
id: ID!
name: String!
email: String!
}
type Query {
user(id: ID!): User
}
اگر کلاینت پرسوجو کند:
{
user(id: 1) {
name
email
}
}
سرور باید بداند که چگونه اطلاعات کاربر با شناسه ۱ را پیدا کند و فیلدهای name
و email
را برگرداند. برای این کار یک Resolver تعریف میکنیم:
const resolvers = {
Query: {
user: (parent, args, context, info) => {
const userId = args.id;
return database.findUserById(userId);
}
}
};
در این مثال:
- parent: دادهای که از فیلد بالادستی آمده است (معمولاً در Query اصلی null است).
- args: آرگومانهایی که کلاینت ارسال کرده، مثل
id
. - context: اطلاعات مشترک مثل احراز هویت یا اتصال به پایگاه داده.
- info: اطلاعات فنی درباره پرسوجو و فیلدهای درخواست شده.
چگونه GraphQL پاسخ میدهد؟
زمانی که یک پرسوجو ارسال میشود، GraphQL به ترتیب زیر عمل میکند:
- پرسوجو را بررسی میکند تا مطمئن شود با Schema مطابقت دارد.
- برای هر فیلد، Resolver مربوطه را فراخوانی میکند.
- مقادیر برگشتی Resolverها را جمعآوری و در قالب JSON به کلاینت برمیگرداند.
مثال پاسخ GraphQL:
{
"data": {
"user": {
"name": "Ali",
"email": "ali@example.com"
}
}
}
با این مکانیزم، GraphQL دقیقاً همان دادههایی را که کلاینت درخواست کرده، برمیگرداند و میتواند دادههای پیچیده و تو در تو را به شکل ساختاریافته مدیریت کند.
جمعبندی
مفهوم | کاربرد |
---|---|
Resolver | تابعی که مشخص میکند هر فیلد چگونه مقداردهی شود و داده واقعی را برگرداند |
نحوه پاسخدهی GraphQL | بررسی پرسوجو با Schema، اجرای Resolverها و بازگرداندن دادهها در قالب JSON |
با درک Resolverها، شما میتوانید کنترل کاملی بر دادههای دریافتی از GraphQL داشته باشید و پاسخها را دقیقاً بر اساس نیاز کلاینت تنظیم کنید.