Rumah >hujung hadapan web >tutorial js >Mengapa Anda Harus Mengelak Kaedah Utiliti dalam Penyelesai GraphQL

Mengapa Anda Harus Mengelak Kaedah Utiliti dalam Penyelesai GraphQL

Susan Sarandon
Susan Sarandonasal
2025-01-05 03:40:39778semak imbas

Why You Should Avoid Utility Methods in GraphQL Resolvers

GraphQL telah merevolusikan cara kami mengambil dan membentuk data, menyediakan lapisan abstraksi yang bersih antara pelanggan dan pelayan. Salah satu ciri terasnya, penyelesai, membolehkan kami menentukan cara setiap medan dalam skema kami mendapat datanya. Dalam sesetengah kes, pembangun mungkin secara tidak sengaja mengurangkan faedah GraphQL dengan bergantung pada kaedah utiliti dalam penyelesai. Amalan ini bukan sahaja mengalahkan tujuan reka bentuk GraphQL tetapi juga memperkenalkan kerumitan yang tidak perlu dan potensi pepijat.

Mari kita mendalami mengapa ini bermasalah dan cara untuk melakukan yang lebih baik.

Kuasa Penyelesai

Dalam GraphQL, penyelesai digunakan untuk setiap contoh jenis, tidak kira di mana jenis itu muncul dalam skema anda. Abstraksi ini memastikan bahawa logik untuk menyelesaikan data kekal konsisten di seluruh papan. Contohnya:

schema {
  query: Query
}

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

type Project {
  id: ID!
  name: String!
  owner: User!
}

type User {
  id: ID!
  name: String!
  email: String!
}

Di sini, jenis Pengguna digunakan di dua tempat: terus dalam Pertanyaan untuk mengambil pengguna dan bersarang dalam jenis Projek sebagai pemilik. Terima kasih kepada sistem penyelesai GraphQL, kami boleh menentukan penyelesai Pengguna tunggal untuk mengendalikan cara medan Pengguna diselesaikan, memastikan tingkah laku yang konsisten di mana-mana Pengguna muncul.

Masalah dengan utils

Apabila anda memperkenalkan kaedah utiliti untuk membentuk data di luar penyelesai anda, anda memecahkan abstraksi ini. Pertimbangkan contoh ini:

// utils.ts
function mapToUser(userData: DataSourceUser) {
  return {
    id: userData.id,
    name: userData.full_name,
    email: userData.contact_email,
  };
}

// resolvers.ts
const resolvers: Resolvers<Context> = {
  Query: {
    project: async (_, { id }, { dataSources }) => {
      const project = await dataSources.projectAPI.getProject(id);
      return {
        ...project,
        owner: mapToUser(project.owner), // Utility method called here
      };
    },
    user: async (_, { id }, { dataSources }) => {
      const user = await dataSources.userAPI.getUser(id);
      return mapToUser(user); // Utility method called here
    },
  },
};

Pada pandangan pertama, ini mungkin kelihatan baik. Tetapi inilah sebabnya ia bermasalah:

1. Logik Pendua

Anda terpaksa memanggil mapToUser dalam setiap penyelesai tempat jenis Pengguna muncul. Terlupa untuk memanggilnya atau memanggilnya secara salah boleh menyebabkan gelagat tidak konsisten merentas API anda.

2. Memecah Abstraksi

Sistem penyelesai GraphQL direka untuk memusatkan cara setiap jenis diselesaikan. Dengan menggunakan kaedah utiliti, anda mengetepikan ciri ini dan menjadikan kod anda kurang intuitif.

3. Kehilangan Fleksibiliti

Jika anda perlu mengubah suai cara jenis Pengguna diselesaikan (cth., menambah medan baharu atau mengendalikan ralat), anda perlu memburu setiap tempat di mana mapToUser dipanggil dan bukannya mengemas kini penyelesai tunggal.

Pendekatan yang Lebih Baik: Penyelesai Jenis Leverage

Daripada menggunakan kaedah utiliti, tentukan penyelesai untuk jenis GraphQL anda. Begini cara anda boleh menulis semula contoh di atas:

schema {
  query: Query
}

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

type Project {
  id: ID!
  name: String!
  owner: User!
}

type User {
  id: ID!
  name: String!
  email: String!
}

Mengapa Ini Lebih Baik

  1. Ketekalan: Penyelesai Pengguna memastikan semua kejadian Pengguna diselesaikan dengan cara yang sama, tidak kira di mana ia muncul dalam skema.
  2. Logik Berpusat: Perubahan kepada cara Pengguna diselesaikan hanya perlu dibuat di satu tempat.
  3. Memanfaatkan Kekuatan GraphQL: Dengan menerima sistem penyelesai, anda menyelaraskan dengan prinsip reka bentuk teras GraphQL dan memanfaatkan potensi penuhnya.

Kesimpulan

Menggunakan kaedah utiliti dalam penyelesai anda mungkin kelihatan seperti jalan pintas, tetapi ia akhirnya menjejaskan kuasa dan keanggunan GraphQL. Dengan menentukan penyelesai untuk jenis anda, anda boleh mengekalkan API yang bersih, konsisten dan berskala. Jadi berhenti menggunakan util dalam penyelesai anda dan terima abstraksi yang disediakan oleh GraphQL—diri masa depan anda akan berterima kasih!

Atas ialah kandungan terperinci Mengapa Anda Harus Mengelak Kaedah Utiliti dalam Penyelesai GraphQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn