انتقل إلى المحتوى

إنشاء تواقيع دوال Resolver في GraphQL — Numio

يُنشئ تواقيع أنواع المحلِّلات (resolvers) لمخطط GraphQL: TypeScript (الافتراضي، typescript-resolvers) أو Flow (flow-resolvers) أو Java (java-resolvers). تتضمن مخرجات TypeScript خريطة Resolvers تحتوي على كائن محلِّلات مُنمَّط واحد لكل نوع في المخطط.

تنميط كائن المحلِّلات المُمرَّر إلى Apollo Server أو graphql-yoga بحيث تُفحص parent وargs والقيم المُعادة.

GraphQL Schema

متى تستخدمها

  • تنميط كائن المحلِّلات المُمرَّر إلى Apollo Server أو graphql-yoga بحيث تُفحص parent وargs والقيم المُعادة.
  • الحصول على واجهات DataFetcher في graphql-java لكل نوع عبر خيار JAVA Resolvers Signature.

طريقة الاستخدام

  1. الصق المخطط في محرر GraphQL Schema.
  2. اختر TypeScript Resolvers Signature أو Flow Resolvers Signature أو JAVA Resolvers Signature من القائمة المنسدلة للمخرجات.
  3. انسخ المخرجات؛ في TypeScript أضف نوع Resolvers المُنشأ كتعليق نوع لخريطة المحلِّلات.

مخطط GraphQL

type Query {
  user(id: ID!): User
}

type User {
  id: ID!
  name: String
}

تواقيع المحلِّلات

import { GraphQLResolveInfo } from "graphql"
…
export type QueryResolvers<
  ContextType = any,
  ParentType extends
    ResolversParentTypes["Query"] = ResolversParentTypes["Query"],
> = {
  user?: Resolver<
    Maybe<ResolversTypes["User"]>,
    ParentType,
    ContextType,
    RequireFields<QueryUserArgs, "id">
  >
}

export type UserResolvers<
  ContextType = any,
  ParentType extends
    ResolversParentTypes["User"] = ResolversParentTypes["User"],
> = {
  id?: Resolver<ResolversTypes["ID"], ParentType, ContextType>
  name?: Resolver<Maybe<ResolversTypes["String"]>, ParentType, ContextType>
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
}
…

التفاصيل والقيود

الأنواع المُنشأة مثل QueryResolvers لها ContextType = any؛ وتُنمَّط الوسائط المطلوبة بـ RequireFields، وتتضمن محلِّلات الكائنات __isTypeOf اختياريًا.

يُستخدم المخطط فقط. لا تعتمد تواقيع المحلِّلات على العمليات، لذا لا يوجد محرر Documents في الصفحة.

يُخرج خيار Java واجهات public interface تحتوي على دوال DataFetcher داخل public class Resolvers في الحزمة com.example.graphql. يعمل كل شيء في Web Worker داخل المتصفح.

FAQ

كيف أحدد نوع السياق الخاص بي؟

لا تحتوي الصفحة على خيارَي mapper أو contextType. مرّر نوع السياق كمعامل generic، مثل Resolvers<MyContext>، إذ يقبل كل نوع محلِّل مُنشأ ContextType.

لماذا كل حقول المحلِّلات اختيارية؟

يجعل typescript-resolvers افتراضيًا كل محلِّل حقل اختياريًا، لأن خوادم GraphQL تلجأ إلى محلِّلات افتراضية تقرأ الخاصية من الكائن الأب.

كيف ينمّط خيار Java حقول ID؟

تُعاد حقول النوع ID وأنواع الكائنات بصيغة DataFetcher<Object>؛ وتصبح حقول String بصيغة DataFetcher<String>.

المواصفات والمراجع