2017-08-11 46 views
0

我想在chaincode中執行豐富的查詢。每個同行都有CouchDB,我在marble source code中有跟隨示例。 但我沒有得到任何結果(沒有錯誤),只是一個空的數組。豐富的查詢沒有結果 - Hyeperledger織物v1.0

enter image description here

當我運行在CouchDB中相同的查詢,直接就沒有問題,我得到一個或多個結果。

enter image description here

這是chaincode源代碼我使用:

if len(args) == 3 && args[1] == "complex" { 
    fmt.Printf("Query complex\n") 

    if isJSON(args[2]) { 

     fmt.Printf("Complex query: %s\n", args[2]) 

     resultsIterator, err := stub.GetQueryResult(args[2]) 
     if err != nil { 
      jsonResp := "{\"Error\":\"Not able to make the query, see error: " + err.Error() + "\"}" 
      return shim.Error(jsonResp) 
     } 
     defer resultsIterator.Close() 

     // buffer is a JSON array containing QueryRecords 
     var buffer bytes.Buffer 
     buffer.WriteString("[") 

     bArrayMemberAlreadyWritten := false 
     for resultsIterator.HasNext() { 
      queryResponse, err := resultsIterator.Next() 
      if err != nil { 
       jsonResp := "{\"Error\":\"Not able to make the query, see error: " + err.Error() + "\"}" 
       return shim.Error(jsonResp) 
      } 
      // Add a comma before array members, suppress it for the first array member 
      if bArrayMemberAlreadyWritten == true { 
       buffer.WriteString(",") 
      } 
      buffer.WriteString("{\"Key\":") 
      buffer.WriteString("\"") 
      buffer.WriteString(queryResponse.Key) 
      buffer.WriteString("\"") 

      buffer.WriteString(", \"Record\":") 
      // Record is a JSON object, so we write as-is 
      buffer.WriteString(string(queryResponse.Value)) 
      buffer.WriteString("}") 
      bArrayMemberAlreadyWritten = true 
     } 
     buffer.WriteString("]") 

     fmt.Printf("Query Response: %s\n", buffer.String()) 

     return shim.Success(buffer.Bytes()) 
    } 

    jsonResp := "{\"Error\":\"The query is not a valid JSON\"}" 
    return shim.Error(jsonResp) 
} 
+0

文本的屏幕截圖非常不友好,特別是對於搜索引擎和屏幕閱讀器。請複製並粘貼文本。 – Flimzy

+0

@Flimzy屏幕截圖不是來自Fabric的代碼或錯誤或文本。所有這些都是我的chaincode(第一個)的自定義文本,第二個是Fauxton的查詢結果。我沒有看到爲什麼如果我從這裏的屏幕截圖複製/過去文本,搜索引擎會更有效率。 – AnTiToinE

+0

我不是在談論Fauxton屏幕截圖。我在談論第一張照片。 – Flimzy

回答

3

的問題是具有與辦 '的數據。' Fabric注入到保存到CouchDB狀態數據庫的文檔中的元數據信封。從鏈代碼作者的角度來看,沒有'數據'信封,因此'數據'信封應該從傳入的任何查詢中排除。結構將在保存和查詢時注入'數據'信封。如果您使用Fauxton UI直接對CouchDB進行試用查詢(沒有Fabric注入代碼的好處),則需要包含「數據」信封。只要記住在編寫鏈式代碼查詢時排除'數據'信封。

查看example queries對應於marbles02示例,請注意,沒有提供數據信封。