我建立GrapQL服務器通過桑格利亞GraphQL( 「org.sangria-graphql」 %% 「汽酒」 % 「1.0.0-RC5」)怎麼知道請求在對象的解析器字段桑格利亞GraphQL
我我不確定它是否正常需要。但爲了提高性能,我想在解析期間從客戶端獲取請求的字段。
例如,
如果你提出要求,
query Query{
FooObject{
fieldA
fieldB
}
}
你的服務器FooObject對象解析器
resolve = Ctx => DB.session
.query("select fieldA, fieldB, FieldC, FieldD from DATA_TABLE")
.map(entity => DataObject(entity.fieldA, entity.fieldB) // By ORM Mapper
)
則可以解決,
對象場可以解決FooObject對象的域解析器
Field("fieldA", type..., resolve = _.fieldA)
Field("fieldB", type..., resolve = _.fieldB)
Field("fieldC", type..., resolve = _.fieldC)
Field("fieldD", type..., resolve = _.fieldD)
然後,你可能會得到graphql導致
{
data:{
FooObject:{
FieldA: "DataA"
FieldB: "DataB"
}
}
}
什麼,我試圖做的是,在對象解析器解析過程中,給現場提示如下圖所示。
resolve = Ctx => {
// Seq(FieldA[], FieldB[])
val requestedFields: Seq[Field[ ... ]] = Ctx.[__COLLECT_REQUESTED_FIELDS__]()
// "FieldA, FieldB"
val fetchingFieldInQuery:String = requestedFields.foldRight("")((acc, nextField) => acc + ", nextField")
DB.session
.query(s"select ${fetchingFieldInQuery} from DATA_TABLE")
.map(entity => DataObject(entity.fieldA, entity.fieldB)) // By ORM Mapper
}
在這種情況下,我無法找到某種方式來提取客戶端在解析器中請求的字段。 Ctx(context)
對象顯示了該對象與我調查中的要求無關。有沒有像我提到的方法Ctx.[__COLLECT_REQUESTED_FIELDS__]()
?
我可以嘗試每個字段解析器通過在數據庫中選擇一列進行查詢。但是如果我可以知道已經請求了什麼字段,我可以在一個查詢中完成它,並且它可以解決很多案例問題(因爲頂級對象可以將查詢中的所有嵌套對象,它可能取決於數據庫)
我知道還有沒有最佳做法GraphQL
仍然。 比我想要的更好的方式可能存在。購買了解所要求的字段對於製作處理數據非常有用。
如果你知道,讓我知道它。
謝謝。