GraphQL 徹底改變了我們獲取和塑造資料的方式,在客戶端和伺服器之間提供了一個乾淨的抽象層。它的核心功能之一是解析器,它允許我們定義模式中的每個欄位如何取得其資料。在某些情況下,開發人員可能會透過依賴解析器中的實用方法無意中削弱 GraphQL 的優勢。這種做法不僅違背了 GraphQL 的設計初衷,還引入了不必要的複雜性和潛在的 bug。
讓我們深入探討為什麼會出現這個問題以及如何做得更好。
旋轉變壓器的力量
在 GraphQL 中,會為類型的每個實例呼叫解析器,無論類型出現在架構中的位置。這種抽象確保了解析資料的邏輯在整體上保持一致。例如:
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! }
這裡,User 類型在兩個地方使用:直接在 Query 中用於獲取用戶,以及作為所有者嵌套在 Project 類型中。借助 GraphQL 的解析器系統,我們可以定義單一 User 解析器來處理 User 欄位的解析方式,確保 User 出現的任何地方的行為一致。
utils 的問題
當您引入實用方法來在解析器之外塑造資料時,您就打破了這種抽象。考慮這個例子:
// 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 }, }, }; </context>
乍一看,這似乎沒問題。但這就是它有問題的原因:
1. 重複的邏輯
您被迫在出現使用者類型的每個解析器中呼叫mapToUser。忘記呼叫它或錯誤地呼叫它可能會導致 API 中的行為不一致。
2. 打破抽象
GraphQL 的解析器系統旨在集中解決每種類型的方式。透過使用實用程式方法,您可以迴避此功能並使您的程式碼不太直觀。
3. 失去彈性
如果您需要修改使用者類型的解析方式(例如,新增欄位或處理錯誤),您將必須尋找呼叫 mapToUser 的每個位置,而不是更新單一解析器。
更好的方法:槓桿式旋轉變壓器
不要使用實用方法,而是為 GraphQL 類型定義解析器。以下是重寫上面範例的方法:
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! }
為什麼這更好
- 一致性:使用者解析器確保所有使用者實例都以相同的方式解析,無論它們出現在架構中的哪個位置。
- 集中邏輯:只需在一處更改使用者的解析方式。
- 利用 GraphQL 的優勢:透過採用解析器系統,您可以與 GraphQL 的核心設計原則保持一致並充分發揮其潛力。
結論
在解析器中使用實用方法似乎是一種捷徑,但它最終會破壞 GraphQL 的強大功能和優雅性。透過為您的類型定義解析器,您可以維護一個乾淨、一致且可擴展的 API。因此,停止在解析器中使用 utils,擁抱 GraphQL 提供的抽象化——未來的你會感謝你的!
以上是為什麼應該避免 GraphQL 解析器中的實用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Dreamweaver Mac版
視覺化網頁開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。