簡體   English   中英

apollo graphql 突變應該返回哪個值?

[英]Which value should be returned by a apollo graphql mutation?

我正在使用 apollo graphql 調用一些突變來更改數據庫數據。 我需要一些建議,通常應該返回哪個值。

對於insertOne() ,我將返回新文檔的 ID,對於刪除數據集,我還將返回 ID,以刪除客戶端緩存上的數據集。

但是updateOne呢 - 因為它可能是一個非常簡單的任務,如下所示,但有時它可以進行一些復雜的更新? 我不太確定哪個是最有用的返回值。

在這個簡單的示例中,我只是更新了特定 mongodb 文檔的一些內容。 現在這個方法的 WriteResult 被返回了。 但這真的有用嗎?

我看到以下選項:

  1. 返回 writeResult object - 需要在后端定義
  2. 檢查writeResult並返回 boolean,例如 result.nModified > 0
  3. 返回內容結果 - 最后只是輸入內容
  4. 返回更新后的文檔 - 這需要findOne({ _id: id })
  5. 只是返回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.

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