簡體   English   中英

GraphQL:許多小突變,或一個批量突變?

[英]GraphQL: Many small mutations, or one bulk mutation?

假設我是一名用戶,我在一些任意應用上編輯我的個人資料。 該應用程序讓我做了一些更改,當我完成后,我點擊“保存”,我的個人資料得到更新。

GraphQL建議的最佳做法是什么來處理這樣的大型更新? 在我看來,有幾個選擇:

A) 許多小突變 如果用戶更改了5件事(即姓名,電子郵件,用戶名,圖片,生物),客戶端可以向服務器發起5次突變。

優點:更小,更孤立的運營。

缺點:這不會打敗GraphQL中“一次往返服務器”的目的,因為它需要...... 5?

B) 許多小突變,稱為服務器端 您可以將數據blob發布到服務器並具有解析它的函數,並對其找到的數據運行單獨的突變,而不是從客戶端調用5個突變,需要5次往返。

優點:一次往返

缺點:我們必須在應用程序中添加另一個圖層來處理這個問題。 新功能會變得混亂,難以測試,並且難以維持。

C) 一個大的突變 用戶通過單個突變將數據blob發送到服務器,該突變在文檔上批量設置新數據,而不是在每個字段上運行單個突變。

優點:DX; 一次往返。

缺點:由於字段作為參數傳遞,因此打開應用程序進行攻擊。 惡意用戶可以嘗試傳遞任意字段,設置不應更改的字段(即isAdmin字段)等。突變必須是明智的,以了解哪些字段允許更新,拒絕/忽略其余字段。


我在網上找不到很多關於在GraphQL中做這種事情的“正確方法”的方法。 希望在這里找到一些答案/反饋。 謝謝!

我會選擇第三個解決方案, 一個大突變 我不確定我理解你對惡意用戶傳遞任意字段的觀點:他們無法傳遞未在模式中定義的字段。

至於服務器端邏輯,你無論如何都必須進行那些智能檢查:你永遠不能相信客戶端!

A)許多小突變。 如果用戶更改了5件事(即姓名,電子郵件,用戶名,圖片,生物),客戶端可以向服務器發起5次突變。

您可以在單個請求中執行多個突變。 無需多次調用服務器。

這是一個例子:

mutation {
  setUserName(name: "new_name") { ok }
  setUserEmail(email: "new_email") { ok }
}

B)許多小突變,稱為服務器端。 您可以將數據blob發布到服務器並具有解析它的函數,並對其找到的數據運行單獨的突變,而不是從客戶端調用5個突變,需要5次往返。

當您改變多個字段或一次執行多個查詢時,這正是GraphQL為您所做的。

C)一個大的突變。 用戶通過單個突變將數據blob發送到服務器,該突變在文檔上批量設置新數據,而不是在每個字段上運行單個突變。

即使您使用多個字段,仍可以批量設置數據。
這將要求您不必直接更新數據庫,而是將請求傳遞給中間件,該中間件將在執行所有突變解析器后構建並執行單個查詢。

缺點:由於字段作為參數傳遞,因此打開應用程序進行攻擊。 惡意用戶可以嘗試傳遞任意字段,設置不應更改的字段(即isAdmin字段)等。突變必須聰明才能知道哪些字段允許更新,拒絕/忽略其余字段。

您不應該使用任意變量,而是將所有允許的屬性列為參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM