[英]Which value should be returned by a apollo graphql mutation?
我正在使用 apollo graphql 調用一些突變來更改數據庫數據。 我需要一些建議,通常應該返回哪個值。
對於insertOne()
,我將返回新文檔的 ID,對於刪除數據集,我還將返回 ID,以刪除客戶端緩存上的數據集。
但是updateOne
呢 - 因為它可能是一個非常簡單的任務,如下所示,但有時它可以進行一些復雜的更新? 我不太確定哪個是最有用的返回值。
在這個簡單的示例中,我只是更新了特定 mongodb 文檔的一些內容。 現在這個方法的 WriteResult 被返回了。 但這真的有用嗎?
我看到以下選項:
findOne({ _id: id })
true
,這可能不是很有用?!我知道沒有適用於所有用例的單一解決方案,但也許有人可以解釋一般來說 go 的方式......
服務器
async updateContent(id, name, value) {
const Content = this.db.collection('content')
return Content.updateOne(
{ _id: id },
{ $set: { [name]: value } }
)
}
客戶
updateContent({
variables: { id, name, value }
})
.then((response) => {
// response.data.updateContent
})
.catch((error) => console.error(error))
graphql
mutation updateContent($id: ID!, $name: String, $value: String) {
updateContent(id: $id, name: $name, value: $value) {
nModified
}
}
圖式
type WriteResult {
nModified: Int,
nRemoved: Int,
nInserted: Int,
n: Int
ok: Int
}
type Mutation {
updateContent(id: ID!, name: String, value: String): ContentString
}
擴展之前的評論...
通常突變解析器返回...突變類型(但它是 graphql,您不必查詢所有字段/道具;響應將被過濾掉;返回數據 = 成功)...甚至刪除了,驚喜::D
返回突變的 object 類型對於更高級的 FE 技術(如樂觀響應)可能很重要。 這有助於避免在更新一個元素時重新獲取整個項目列表。
類型定義不正確 - 這是您的擔憂之源
可能您應該將其定義得更像(輸入類型更易於管理):
type ContentType {
id: ID!
content: String!
author: User!
createdAt: Date!
updatedAt: Date!
}
type ContentCreateInputType {
name: String!
value: String!
}
type ContentUpdateInputType {
id: ID!
name: String!
value: String!
}
type Stats {
nModified: Int,
nRemoved: Int,
nInserted: Int,
n: Int
ok: Int
}
type ContentUpdatePayload {
content: ContentType
stats: Stats
}
type Mutation {
updateContent(input: ContentUpdateInputType!): ContentUpdatePayload
}
這與流行的繼電器樣式 cursor 分頁有點相似。
你的突變可以是:
mutation updateContent($input: ContentUpdateInputType) {
updateContent(input: $input) {
stats {
nModified
}
}
}
...在這種情況下,您的解析器必須僅返回 stats object,不需要findOne
...但實際上它應該至少返回:
{
content: {
id
}
stats: {
nModified
nRemoved
// etc.
}
}
...因為您的突變也可以是:
mutation updateContent($input: ContentUpdateInputType) {
updateContent(input: $input) {
content {
id
content
author {
id
name
}
}
stats {
nModified
}
}
}
返回{ content: { id } stats: {....} }
(js object,最小突變響應)是解決整個查詢的必要條件(非常重要) 。 服務器解析器將知道它尚未完成ContentType
object(突變ContentUpdatePayload
元素),它將調用ContentType
解析器(以已知/已解析的id
作為 arg)來填充它(當然它也會調用Author
類型解析器)。
正如您在上面注意到/看到的,僅返回一個content { id }
(來自這個突變, ContentType
的一部分)可以是優化的一部分 -沒有過度獲取- 因為id
可以從突變參數中獲取並且整個內容都被解析/僅在需要時從數據庫/服務中讀取。
返回未鍵入的響應根本不允許這種“GraphQL 魔術”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.